J'essaie depuis quelques jours maintenant de rendre mes mises en page plus efficaces en passant de l'utilisation de plusieurs niveaux d'imbrication LinearLayouts
à un seul RelativeLayout
et j'ai rencontré quelques problèmes pour lesquels je n'ai pas été en mesure de trouver une solution de contournement ...
J'ai recherché le groupe de débutants Android et ce site et je n'ai rien trouvé qui m'aiderait à résoudre le problème.
J'ai lu sur l'un des blogs que vous pouvez combiner des mises en page avec fusion et inclure des balises. Donc, ce que j'ai est un fichier de mise en page principal avec un RelativeLayout
élément racine. À l'intérieur de cela, j'ai 5 balises d'inclusion qui font référence à 5 fichiers de mise en page XML différents qui ont chacun un élément de fusion pour la racine (tous mes fichiers de fusion sont les mêmes à l'exception des identifiants qu'ils contiennent).
Je rencontre deux problèmes, que j'expliquerai après avoir publié une version simplifiée de mon code de mise en page:
Exemple de fichier de mise en page principal:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/translucent_gray" >
<include
android:id="@+id/running_gallery_layout_id"
layout="@layout/running_gallery_layout" />
<include
android:id="@+id/recent_gallery_layout_id"
layout="@layout/recent_gallery_layout"
android:layout_below="@id/running_gallery_layout_id" />
<include
android:id="@+id/service_gallery_layout_id"
layout="@layout/service_gallery_layout"
android:layout_below="@id/recent_gallery_layout_id" />
<include
android:id="@+id/process_gallery_layout_id"
layout="@layout/process_gallery_layout"
android:layout_below="@id/service_gallery_layout_id" />
</RelativeLayout>
Exemple de fichier de fusion inclus:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
style="@style/TitleText"
android:id="@+id/service_gallery_title_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:text="@string/service_title" />
<Gallery
android:id="@+id/service_gallery_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_below="@id/service_gallery_title_text_id" />
<TextView
style="@style/SubTitleText"
android:id="@+id/service_gallery_current_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/service_gallery_title_text_id"
android:layout_above="@id/service_gallery_id" />
</merge>
Je rencontre deux problèmes:
1) Les android:layout_*
attributs semblent être ignorés lorsqu'ils sont utilisés dans la balise include et toutes les mises en page fusionnées sont affichées les unes sur les autres. Selon ce post ( http://developer.android.com/resources/articles/layout-tricks-reuse.html ) "n'importe quel android:layout_*
attribut peut être utilisé avec la <include />
balise"
2) Comme je ne pouvais pas faire fonctionner cela, j'ai décidé d'essayer d'ajouter un android:layout_below
attribut au premier TextView
élément de chaque fichier de mise en page de fusion, ce qui signifie que chaque fichier de fusion ferait référence à un identifiant d'un autre fichier de mise en page de fusion ... Pour la plupart, ceci effectivement travaillé et ma mise en page semble bien. Cependant, j'obtiens une erreur sur l'un des android:layout_below
attributs indiquant qu'il ne trouve pas l'ID que j'ai spécifié ... J'ai vérifié deux fois et trois fois les identifiants pour m'assurer qu'ils étaient corrects. La partie la plus étrange est que j'ai utilisé la AutoFill
fonctionnalité pour mettre l'identifiant dans l'attribut en premier lieu.
Si quelqu'un a des suggestions ou des solutions de contournement, je serai plus qu'heureux de les essayer. De plus, si quelqu'un peut penser à un moyen pour moi d'avoir juste un fichier de mise en page XML de fusion au lieu de 5, ce serait grandement apprécié. Je n'ai pas trouvé de moyen de le faire car je dois avoir accès à chaque élément des fichiers de mise en page de fusion au moment de l'exécution ...