11
votes

En utilisant layout_gravity = "fond" pour placer au bas de linearlayout

Je voudrais placer une mise en page au bas d'une linearlayout, mais je ne peux pas sembler le faire fonctionner. Je sais que je peux utiliser relativenelayout pour le faire, mais je devrais pouvoir utiliser linearlayout, je ne devrais-je pas?

EDIT: En réalité, cela est plus déroutant que je ne le pensais. La mise en page ci-dessous est simplifiée. En réalité, j'utilise des fragments sur un périphérique avant 3.0, avec la couche de compatibilité.

J'ai utilisé la visionneuse de hiérarchie pour examiner ce qui se passe et trouvé qu'un android.support.v4.app.nosavestateframelayout a été ajouté à ma mise en page et cette mise en page a layout_height définie sur Wrap_Content. Cela semble être ce qui cause mon problème, mais je n'ai pas encore compris comment le réparer.

Spécifiquement, pourquoi cela ne fonctionne-t-il pas? La version_gravité ne devrait-elle pas le placer en bas? xxx

BTW, changeant layout_height à remplir_parent ou définir layout_weight Ne semble pas fonctionner non plus. Je veux juste mieux comprendre ce qui se passe, car il manque clairement quelque chose d'important. Merci.


2 commentaires

Qu'est ce que ça fait? Pouvez-vous poster un instantané de la mise en page.


Il ne fait que place la deuxième mise en page juste en dessous de la mise en page précédente.


5 Réponses :


0
votes

linearlayout va simplement empiler des choses comme elles sont placées là-bas. Comme il est vertical, il continuera à placer des articles l'un après la prochaine de manière verticale. Pouvez-vous changer l'androïde: gravité de la linearlayout et non la version_gradité de la nichée et voir si cela fonctionne.

Le relativelayouout de bien sûr devrait être le premier moyen mais vous avez déclaré que vous n'avez pas voulu le faire. Y a-t-il une raison pour ça?


7 commentaires

Deux raisons de ne pas vouloir utiliser RELATILAYAYOUT: On est que j'ai un tas d'articles ci-dessus et que je n'ai pas senti que l'ajout d'Android: Layout_below = "" les uns sur les autres. L'autre raison est que je veux juste mieux comprendre cela mieux.


Utilisation de la gravité au lieu de layout_gravity ne fonctionne pas avec layout_height définie sur Wrap_Content, comme prévu. Mais si je fixais layout_height à remplir_parent et de gravité en bas, cela ne fonctionne pas non plus - j'ai oublié de mentionner cela, mais cela semble que cela devrait fonctionner aussi, non?


Utilisez des relatifs et deux linéaires ... Alignez un linéaire vers le haut et un au fond, puis placez toutes vos tâches à l'intérieur.


Merci, mais j'ai trouvé une solution sans nicher des mises en page supplémentaires; Vous venez de trouver quelle vue devrait prendre le reste de l'espace blanc et assigner un poids de layout_weight - mieux que de nidifier IMHO.


Vous devez maintenant vous assurer que cela fonctionne sur toutes les tailles d'écran ... Ce n'est pas plus profond de nidification de votre question. C'est deux linéaires imbriqués à l'intérieur d'un parent.


En fait, il s'agit d'un plus grand niveau de nidification au sommet, mais pas vraiment significatif. Cependant, vous semblez dire que la solution Layout_Weight nécessite plus de tests sur différentes tailles d'écran que de nidifier à l'intérieur d'une relativation. Pourquoi donc?


Cela dépend vraiment ... Vous n'avez pas fourni de nombreuses informations sur le nombre de boîtes que vous allez créer, etc.



17
votes

Tout d'abord une belle question.

Android se comporte que nous pouvons dire bizarre dans la situation comme celle-ci.

Si vous avez sélectionné l'orientation d'orientation de la présentation linéaire parent, vous pouvez définir son composant enfant en bas en réglant sa layoug_gravity = en bas. Supposons que vous ayez ajouté 2 vues de texte dans cette mise en page linéaire horizontale et la deuxième textuelle Layout_gravity_gravité est en bas, elle fonctionnera en bas, mais elle fonctionne comme si elle est définie en bas dans une autre colonne, puis la première vue de texte. NOTE : Vous pouvez définir layout_gravity de TextView = "GAUCHE" ou "À droite" lorsque son parent linearlayout est horizontal mais que vous ne pouvez pas voir son résultat.

opposé, si vous avez sélectionné l'orientation de la linearlayout d'origine verticale, vous pouvez définir son composant enfant à gauche ou à droite à l'aide de layout_gravity. Mais le deuxième TextView vous montrera que vous pouvez dire la ligne suivante avec la gravité gauche ou droite que vous avez définie. NOTE Vous pouvez définir layout_gravity de TextView = "TOP" ou "bas" lorsque sa disposition linéaire est verticale mais que vous ne pouvez pas voir son résultat.

Essayez de faire un exemple de conception XML comme je l'ai indiqué ci-dessus afin d'obtenir une meilleure idée.

étrange mais vrai !!! Essayez de comprendre ce comportement. :)


1 commentaires

Oui, vous avez raison, l'orientation = vertical / layout_gravity = bas tuple ne semble pas fonctionner, et il est donc logique que l'opposé horizontal / gauche ne fonctionne pas aussi bien.



10
votes

Alors j'ai résolu le problème. C'est une solution en deux parties:

Premièrement, le moyen de le faire sans utiliser linéarlayout est de donner du poids à l'élément ci-dessus afin de prendre tout l'espace vide. BTW, vous pouvez voir cet exemple dans les démos de l'API: HTTP: //developer.android.com/resources/samples/apidemos/res/layout/linear_layout_3.html xxx

ceci par lui-même n'a pas résolu mon problème, Comme j'avais un nosavestateframeLayout avec layout_width = "wrap_content" comme vue parent, et j'ai donc besoin de l'obtenir en premier. J'utilise le code basé sur le merveilleux application Google I / O , et quand j'ai recherché Le code de NosavestateFrameLayout, j'ai trouvé ceci: xxx

merci pour un commentaire génial Google !!! J'ai ajouté cela dans ma source et tout a fonctionné super!

La morale de l'histoire: Visionneuse de hiérarchie et commentaires sont vos amis.


2 commentaires

Merci, la chose de poids m'a aidé avec le mien


Je crois que cela devrait être "pesant_eweight" non simplement "poids" - au moins c'est ce qui semble fonctionner et ce qui est dans le [sdk_dir] / échantillons / Android-8 / apidemos / res / res / res / res / res / res / résolution / res / res / layout / linear_layou t_3.xml



0
votes

Ce pourrait être que, selon https://stackoverflow.com/a/13366783/513038 , vous avez besoin Pour définir le parent linearlayout pour avoir android: baselinealigned = "false" . Travaillé dans mon cas.


0 commentaires

10
votes

Ajoutez simplement de l'espace entre ce que vous voulez en bas et tout le reste:

        <Space
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>


0 commentaires