114 votes

Comment obtenir RelativeLayout travaillant avec fusion et inclure ?

J'essaie depuis quelques jours de faire mes mises en page plus efficace par la conversion de l'utilisation de plusieurs niveaux d'imbrication LinearLayouts d'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).

Je suis en cours d'exécution en deux problèmes, je vais vous expliquer après la publication d'une version simplifiée de ma mise en page de code:

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>

L'é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) L' 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 l' <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 de l'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'une 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é l' AutoFill fonction 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...

Merci à l'avance!

216voto

Macarse Points 36519

Il y a un problème avec la balise include. Vérification : http://code.google.com/p/android/issues/detail?id=2863

Pour le fixer, assurez-vous que vous remplacez les deux et lorsque vous incluez, sinon tout sera ignorée.

33voto

alienjazzcat Points 727

Voir plus fortement voté réponse ci-dessous. Le mien est désuets


je peux 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 afin de les aider adressage et de délimitation de l'étendue même nom de Vues au sein de Justin comprend

Chacun devrait avoir un unique conteneur parent, et vous appel findViewById() sur le conteneur (ViewGroup) plutôt que sur la De l'activité.

En fait, vous aussi devez le faire afin d'obtenir RelativeLayout à se comporter comme prévu:

Cela fonctionne (le pied de page est bien placé):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <include android:id="@+id/header" layout="@layout/header"
        android:layout_alignParentTop="true" />
    <WebView android:id="@+id/webView" android:layout_below="@id/header"
        android:background="#77CC0000" android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:focusable="false" />
    <LinearLayout android:layout_alignParentBottom="true"
        android:layout_height="wrap_content" android:layout_width="fill_parent">
        <include android:id="@+id/footer" layout="@layout/footer" />
    </LinearLayout>
</RelativeLayout>

Ce n'est pas (pied de page est flottant en haut de l'écran):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <include android:id="@+id/header" layout="@layout/header"
        android:layout_alignParentTop="true" />
    <WebView android:id="@+id/webView" android:layout_below="@id/header"
        android:background="#77CC0000" android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:focusable="false" />
    <include android:id="@+id/footer" layout="@layout/footer"
        android:layout_alignParentBottom="true" />
</RelativeLayout>

Le nu - pied 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 à la tête par l'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 j'aime toujours ça :)

8voto

Plantage Points 235

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 l' <merge> balise combiné avec l' <include> balise 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.

L' <merge> tag prend l'enfant des vues et de la pop dans le parent de l' <include> balise. Vous devez donc demander aux enfants dans la mise en page que vous êtes, y compris pour s'ancrer en conséquence.

4voto

Maragues Points 9461

Pour le positionnement au travail le RelativeLayout vous devez définir les paramètres layout_ * dans le fichier include, et non dans le fichier de mise en page principale. Par là

main_layout.Xml

content_layout.Xml

Il s’agit évidemment pas ce que nous, les développeurs veulent, mais c’est la seule solution que j’ai trouvé pour éviter de dupliquer le xml

1voto

CommonsWare Points 402670

Android:layout_* attributs semblent pour être ignoré lorsqu'il est utilisé dans l'include tag et tous les de la fusion de mises en page sont affiché sur le dessus les uns des autres.

Ma conjecture est que vous ne peut pas faire référence, à partir de règles de présentation, android:id les attributs définis sur <include> éléments, seuls ceux qui sont sur le "réel" des widgets et des conteneurs.

Aussi, si quelqu'un peut penser à un moyen pour moi juste une fusion xml de mise en page fichier au lieu de 5, ce serait grandement apprécié.

Simple: mettre tous dans un seul fichier.

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 à runtime

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 votre findViewById() des appels pour obtenir le droit, 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 n'est pas accessible au moment de l'exécution, laissez-moi savoir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X