10
votes

Gridlayout s'effondre sur un petit écran

J'ai linearlayout avec textview , gridlayout et un autre textview . Il est affiché correctement sur de nombreux téléphones et tablettes modernes, mais cela échoue complètement sur un petit affichage comme Nexus S. Voir les images suivantes.

Entrez la description de l'image ici Entrez la description de l'image ici

J'ai essayé de diminuer la taille de la police, retirez le fond de 9 patch et même enlever toutes les marges. Je pouvais voir juste chiffre7 quand il y avait des marges. Ensuite, je les ai minimisés et je peux voir quatre lignes avec leur premier bouton rendu deux fois plus grand que l'affichage. Je ne comprends pas pourquoi, il doit avoir wrap_content largeur.

J'ai essayé de minimiser le code et de la réduire à gridlayout avec une seule ligne et il reste N'apace pas la largeur de l'écran.

Qu'est-ce qui se passe là-bas?

mise à jour:

  • 420x800 MDPI fonctionne
  • 420x800 HDPI est cassé
  • 540x920 HDPI fonctionne
  • 720x1280 HDPI fonctionne

    Mise à jour 2:

    Nexus 5x a les mêmes problèmes lorsque la police est 38SP ou plus grande. Il est intéressant d'intéresser que le concepteur de studio montre une mise en page correcte, mais les deux appareils / émulateurs affichent une vue corrompue et suivante: xxx

    calc.xml: xxx

    styles: xxx

    dimens: xxx

    update 16 févr. < / p>

    Manjunath Prabhakar a déclaré que le problème peut être lié aux poids. J'ai donc essayé de supprimer tous les attributs de poids et que la mise en page ait plus de sens maintenant. Je ne l'ai pas encore réparé cependant. Je envisagerais de réécrire la mise en page à la linearlayouts imbriquée comme un pas en arrière, je fais une prime ouverte pour d'autres suggestions.

    Entrez la description de l'image ici


4 commentaires

Je pense que vous devez mettre une disposition séparée pour les périphériques HDPI.


Vrai. Mais je dois le faire fonctionner sur HDPI en premier. Lorsque je supprime les poids, il peut s'afficher correctement mais les cellules n'occupent pas tous les espaces disponibles. Ni la configuration de layout_gravity attribut à Fill_Horizontal | Fill_vertical aide, comme seule la dernière cellule se développe.


Je pense que vous devez faire de vos articles Largeur Match_Parent pour utiliser la meilleure utilisation du poids de la mise en page! Pouvez-vous essayer cela?


Oui je l'ai fait. Le premier bouton avec le parent de correspondance gagne tous les espaces disponibles.


3 Réponses :


2
votes

Il y a peu de limitations et de restrictions lors de l'utilisation de la gridlayout. Voici le lien vers Documentation

"Gridlayout ne fournit pas de soutien au principe de poids, comme défini en poids. En général, il n'est donc pas possible de Configurez une gridlayout pour distribuer l'espace excédentaire dans le non-trivial proportions entre plusieurs rangées ou colonnes ... pour un contrôle complet sur l'excès de distribution d'espace dans une rangée ou une colonne; utiliser un linearlayout Sous-site pour contenir les composants du groupe de cellules associées. "

Si j'étais vous, j'utilisais la mise en page linéaire ou la disposition de la table.

J'espère que cela vous aidera!


3 commentaires

Point intéressant. J'ai essayé de réécrire le code récemment à la contrainteTlayout, mais j'ai échoué complètement. Je pense que la première mise en œuvre utilisait linéarlayout, mais je détestais que la nidification profonde. Gridlayout aurait dû avoir une meilleure performance et consommer moins de ressources.


J'ai retiré tous les attributs de poids et il n'y a pas assez d'espace pour tous les boutons, mais cela semble mieux maintenant. Je vais poster une capture d'écran mise à jour.


@LEOS ​​LITTAK: C'est bon d'entendre que c'est vous aider à résoudre votre problème! J'ai hâte d'avoir de vos nouvelles



6
votes

Je suppose que c'est un bogue de la version de support de gridlayout .

Regardez sur Ceci attribué ): Je pense que cela est lié à votre question sur le comportement de la taille de la police Nexus 5x. En général, j'ai trouvé beaucoup de bugs associés ICI (liée à Gridlayout Mesure de largeur).

Je vais essayer de vous donner une solution de contournement .

J'utilise com.android.supporthgridlayout-v7:25.1.1 .

Je pense que vous pouvez résoudre vos problèmes de mise en page (les deux L'alignement dans les téléphones plus anciens et la taille de la police dans Nexus 5x) faisant de cette manière: xxx

essentiellement, ce que j'ai fait est d'envelopper chaque groupe de boutons (quatre boutons sauf le Dernière ligne) dans un linearlayout .

Ici, vous pouvez voir comment il ressemble à deux téléphones:

Nexus 5 Capture d'écran Nexus 5

Samsung Galaxy Core Plus (plus vieux) Galaxy Core Plus Capture d'écran

Comme vous pouvez le constater , il y a un problème dans l'alignement de la dernière ligne. Je pense que vous pouvez essayer de résoudre l'alignement de ces boutons jouant avec les propriétés et les attributs. Faites-moi savoir si vous voulez d'autres améliorations dans ce dernier sujet.

J'espère que cela aide.


3 commentaires

Merci, je vais essayer!


J'ai eu du temps pour examiner votre réponse complètement. De manière fondamentale, vous proposez de convertir Gridlayout vers un ensemble de linearlayout. Cela fonctionnera mais je ne suis pas très heureux, car j'ai commenté plus tôt à la réponse de Manjunath.


Oui, je sais que cette mise en œuvre n'utilise pas la flexibilité que Gridlayout supposait offrir, ce n'est pas censé être l'une des meilleures approches. Je voulais juste fournir un moyen de contourner les problèmes



0
votes

Un peu en retard, mais le même problème pourrait être résolu pour moi en définissant layout_width et layout_height des boutons à l'intérieur de la gridlayout (androidx) sur 0DP < / code>. xxx

Voir


0 commentaires