Comment obtenir RelativeLayout de travail avec les fusionner et de les inclure?
J'ai essayé pendant quelques jours pour faire mes mises en page plus efficace par la conversion de l'utilisation de plusieurs niveaux d'imbrication des LinearLayouts
à un RelativeLayout
et avons rencontré quelques problèmes que je n'ai pas été en mesure de trouver une solution de contournement pour...
J'ai cherché sur le Android les débutants du groupe et de ce site et n'ont pas été en mesure de trouver tout ce qui pourrait m'aider à résoudre le problème.
J'ai lu sur l'un des blogs que vous pouvez combiner la mise en page de fusion et comprennent des balises. Donc ce que j'ai est un fichier de mise en page avec un RelativeLayout
de l'élément racine. À l'intérieur de ce que j'ai 5 comprennent des balises de référence 5 xml différents fichiers de mise en page qui ont chacune une fusion de l'élément de la racine (tous mes fusionner des fichiers sont les mêmes, sauf pour les id en eux).
Je suis en cours d'exécution en deux problèmes, qui je l'expliquerai après la publication d'une version simplifiée de ma mise en page de code:
De L'Échantillon Principal Fichier De Mise En Page:
<?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>
Échantillon comprenait fichier de fusion:
<?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 suis en cours d'exécution en deux problèmes:
1) Le android:layout_*
attributs semblent être ignoré lorsqu'il est utilisé dans la balise include et tous de la fusion de mises en page sont affichés les uns sur les autres. Selon ce post (http://developer.android.com/resources/articles/layout-tricks-reuse.html) "tout android:layout_*
attribut peut être utilisé avec le <include />
tag"
2) étant donné que je ne pouvais pas obtenir ce travail, j'ai décidé d'essayer d'ajouter un android:layout_below
attribut de la première TextView
élément dans chaque fusion, fichier de mise en page, ce qui signifie que chaque fichier de fusion serait une référence à un id d'une autre fusion fichier de mise en page... Pour la plupart, ce réellement travaillé, et ma mise en page a l'air bien. Cependant, j'ai une erreur sur l'un des android:layout_below
attributs en disant qu'il ne peut pas trouver l'id que j'ai précisé... j'ai le double et le triple vérifié les identifiants pour s'assurer qu'ils sont corrects. Le plus étrange, c'est que j'ai utilisé le AutoFill
caractéristique pour mettre l'id de l'attribut dans la première place.
Si quelqu'un a des suggestions ou solutions je serai plus qu'heureux de les essayer. Aussi, si quelqu'un peut penser à un moyen pour moi d'avoir juste une fusion xml fichier de mise en page au lieu de 5, ce serait grandement apprécié. Je ne pouvais pas trouver un moyen de le faire parce que j'ai besoin d'avoir accès à chaque élément de la fusion des fichiers de mise à exécution...
Vous devez vous connecter pour publier un commentaire.
Il y a un problème avec la balise include. Vérifier: https://issuetracker.google.com/issues/36908001
De le fixer, assurez-vous d'écraser les
layout_width
etlayout_height
lors de l'inclusion, sinon tout sera ignoré.EditText
entouré par un<merge>
paire.<include>
/<merge>
paire si je entourent chaque<include>
avec n'importe quel type de mise en page. Quelque chose à propos de ce qui se sent comme il pourrait y avoir une justification rationnelle de l'apparente outillage "bug", mais seulement la documentation est défectueux. J'ai mis le fichier inclus unique dimensions des éléments àfill_parent
et puis l'ultime dimensions que je voudrais sont dans l'élément parent. Cela fait sens pour moi.layout_width
etlayout_height
sertie sur mon<include>
. J'ai essayé également la mise enlayout_width
etlayout_height
sur mon<merge>
mais sans succès. Ce qui me manque ?merge
type. Apparemment leinclude
tag paramètres sont appliqués uniquement à la disposition de la racine de la mise en page, pas ses enfant(s) en cas demerge
. Peut-être parce qu'il y a plusieurs enfants au même niveau (à droite en dessous de lamerge
tag) et elle était ambiguë comment appliquer lainclude
tag paramètres puis.Voir le plus fortement voté réponse ci-dessous. Le mien est désuets
je peut aborder un sujet Justin soulevées: l'incapacité de RelativeLayout pour gérer le positionnement de l'inclure (au moins dans ce cas simple, sur un 1.6 émulateur)
CommonsWare suggère d'emballage l'inclut dans un unique conteneur parent, mais le fait dans le but d'aider l'adressage & exploratoire portant le même nom de Vues au sein de Justin comprend
En fait, vous doit également faire afin d'obtenir RelativeLayout à se comporter comme prévu:
Cela fonctionne (pied de page est bien placé):
Ce n'est pas (pied de page est flottant en haut de l'écran):
Le nu pied de page inclure ne s'alignera pas au fond de parent, sans les environs LinearLayout.. je ne dirais pas ce comportement attendu.
En outre, la WebView semble s'attacher à bien pour le en-tête par ID, mais je pense que c'est une illusion, due simplement qui coule au-dessous de l'en-tête à la verticale. J'ai aussi essayé de mettre un bouton juste au-dessus du pied de page comprennent, mais il a obtenu tous les fluides et le mal, trop
RelativeLayout eu plus de problèmes dans la version 1.5, mais je l'aime 🙂
L'homme, c'est vieux, mais il semble venir d'en haut des pistes de recherches, donc je vais commenter.
Je pense que l'astuce ici est que la
<merge>
tag combiné avec le<include>
tag essentiellement de supprimer toute sorte de "parent" afficher le groupe à ce niveau. Alors, qui êtes-vous exactement demandant de "layout_below" quelqu'un d'autre? Personne n'. Il n'y a aucun point de vue à ce niveau.La
<merge>
tag prend l'enfant des vues et de la pop dans le parent de l'<include>
tag. Vous devez donc demander aux enfants dans la mise en page que vous êtes, y compris pour s'ancrer en conséquence.Pour le positionnement de travailler sur RelativeLayout vous devez définir la layout_* les paramètres dans le fichier include, pas dans la mise en page du fichier. De cette façon
main_layout.xml
content_layout.xml
Ce n'est évidemment pas ce que les développeurs veulent, mais c'est la seule solution que j'ai trouvé pour éviter de dupliquer le xml
Ma conjecture est que vous ne peut pas faire référence, à partir de règles de présentation,
android:id
attributs définis sur<include>
éléments, seuls ceux qui sont sur le "réel" des widgets et des conteneurs.Simple: mettre tous dans un seul fichier.
Si vous en avez un
<include>
élément ou 1000, tous les contenus doivent être accessibles au moment de l'exécution. Une exception est si vous avez dupliquéandroid:id
attributs -- vous devez correctement la portée de votrefindViewById()
appels pour obtenir la bonne, tout comme il faut lors de l'obtention des widgets à partir d'une ListView ligne.Si vous pouvez créer un exemple de projet qui utilise 2+ fusionner des fichiers où vous pouvez démontrer que le contenu est pas accessibles au moment de l'exécution, laissez-moi savoir.
<include>
aurait du avoir un unique conteneur parent, et que vous appelezfindViewById()
sur ce récipient (ViewGroup
) plutôt que sur l'Activité.RelativeLayout
n'est pas conçu pour les développeurs qui<include>
cinq copies identiques de la même mise en page XML dans le mêmeRelativeLayout
exemple, plutôt que de créer desViews
ou l'utilisation d'unAdapterView
.RelativeLayout
largement ("Tout le battage médiatique de RelativeLayout", "RelativeLayout n'est pas tout, il est vanté d'être"), car il ne gère pas votre cas spécifique. Vous avez attrapé une 'tude-s'il vous plaît ne soyez pas surpris quand les gens réagissent à cela. Et alors que mon dernier commentaire est élevé sur le snark, les points sont toujours valables. 5 de votre mise en page pourrait ne pas être adaptée sur QVGA, et je n'ai aucune idée de si 5 est une valeur garantie ou se modifier, soit le cas, la commutation de lignes dans unListView
peut-être mieux. Et, de vrai, de réutilisation, de la création d'une coutumeView
classe atouts<include>
.Dans mon cas, la disposition que j'ai essayé d'inclure commence avec
<merge
tag. Quand je l'ai changé pour une mise en page, dire<RelativeLayout
il a travaillé. Ci-dessous en est l'illustration.De TRAVAIL
PAS DE TRAVAIL
J'ai eu le même problème et même la définition de
layout_width
etlayout_height
il ne fonctionne pas.Le problème était que la mise en page, j'ai été notamment eu des balises et après les avoir enlevés, tout a fonctionné comme un charme.
Je suppose que la fusion n'est pas une balise de disposition et de ce fait, il ne peut pas recevoir de positionnement et de paramètres de taille. Depuis tout ce que vous définissez dans est transféré à l'intérieur de la mère de mise en page, les paramètres n'étaient tout simplement les jeter.
TL:DR: il suffit de supprimer les balises, déplacer la xmlns définitions à une véritable mise en page viewholder et vous devriez être bon.
Avant:
De travail: