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 ...
layout_width
et je me suislayout_height
installé sur mon<include>
. J'ai essayé aussi le réglagelayout_width
etlayout_height
sur mon<merge>
mais sans succès. Qu'est-ce que je rate ?Voir la réponse la plus votée ci-dessous. Le mien est terriblement dépassé
Je peux résoudre un problème soulevé par Justin : l'incapacité de RelativeLayout à gérer le positionnement d'un include (au moins dans ce cas simple, sur un émulateur 1.6)
CommonsWare suggère l'emballage comprend dans un conteneur parent unique, mais le fait afin d'aider les aborder et la portée vues au sein de même nom de Justin comprend
En fait, vous devez également le faire pour que RelativeLayout se comporte comme prévu:
Cela fonctionne (le pied de page est bien positionné):
Ce n'est pas le cas (le pied de page flotte en haut de l'écran):
L' inclusion de pied de page nu ne s'alignera pas au bas du parent, sans le LinearLayout environnant. Je n'appellerais pas ce comportement attendu.
De plus, le WebView semble bien s'attacher à l'en- tête par ID, mais je pense que c'est une illusion, car il s'écoule simplement sous l'en-tête verticalement. J'ai également essayé de définir un bouton juste au-dessus du pied de page, mais tout était flottant et faux aussi
RelativeLayout a eu plus de problèmes dans la version 1.5, mais je l'aime toujours :)
la source
Mec, c'est vieux, mais il semble arriver en tête des recherches, alors je vais commenter.
Je pense que l'astuce ici est que la
<merge>
balise combinée avec la<include>
balise supprime essentiellement toute sorte de groupe de vues "parent" à ce niveau. Alors, à qui demandez-vous exactement à quelqu'un d'autre "layout_below"? Personne. Il n'y a pas de vue à ce niveau.La
<merge>
balise prend les vues enfants et les insère directement dans le parent de la<include>
balise. Vous devez donc demander aux enfants de la mise en page que vous incluez de s'ancrer en conséquence.la source
Pour que le positionnement fonctionne sur RelativeLayout, vous devez définir les paramètres layout_ * dans le fichier include, et non dans le fichier layout principal. De cette façon
main_layout.xml
content_layout.xml
Ce n'est évidemment pas ce que nous souhaitons, les développeurs, mais c'est la seule solution que j'ai trouvée pour éviter de dupliquer xml
la source
Je suppose que vous ne pouvez pas référencer, à partir des règles de mise en page, les
android:id
attributs qui sont définis sur les<include>
éléments, seulement ceux qui sont sur des widgets et des conteneurs «réels».Simple: mettez-les tous dans un seul fichier.
Que vous ayez un
<include>
élément ou 1 000, tout le contenu doit être accessible au moment de l'exécution. Une exception est si vous avez desandroid:id
attributs dupliqués - vous devez définir correctement vosfindViewById()
appels pour obtenir le bon, tout comme vous devez le faire lorsque vous obtenez des widgets à partir d'une ligne ListView.Si vous pouvez créer un exemple de projet utilisant plus de 2 fichiers de fusion dans lequel vous pouvez démontrer que le contenu n'est pas accessible au moment de l'exécution, faites-le moi savoir.
la source
essayez:
la source
Dans mon cas, la mise en page que j'essayais d'inclure commence par une
<merge
balise. Quand je l'ai changé en mise en page, disons que<RelativeLayout
cela a fonctionné. Ci-dessous l'illustration.TRAVAIL
CA NE FONCTIONNE PAS
la source
J'ai eu le même problème et même définir
layout_width
etlayout_height
cela n'a pas fonctionné. Le problème était que la mise en page que j'incluais avait des balises et après les avoir supprimées, tout fonctionnait comme un charme. Je suppose que la fusion n'est pas une balise de mise en page et à cause de cela, elle ne peut pas recevoir de paramètres de positionnement et de taille. Puisque tout ce que vous définissez dans est transféré vers la mise en page parent interne, les paramètres ont simplement été jetés.TL: DR: Supprimez simplement les balises, déplacez les définitions xmlns vers un véritable visualiseur de mise en page et vous devriez être bon.
Avant:
Travail:
la source