web-dev-qa-db-fra.com

Quelle est la différence entre Android: height et Android: layout_height?

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="48dp"
    Android:paddingTop="48dp"
    Android:text="Test"
    />

Je m'attendrais à ce que le TextView ait une hauteur mesurée de 96dp, quel que soit l'espace occupé (en termes de hauteur) par "Test" (que l'on s'attend à ce qu'il soit coupé).

Au lieu de cela, je reçois le "Test" complet + 48dp pour le remplissage.

Je peux mettre n'importe quelle valeur valide pour layout_height et obtenir le même résultat.

Pour obtenir une hauteur de 96dp, il me faut:

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="<any valid value>"
    Android:height="48dp"
    Android:paddingTop="48dp"
    Android:text="Test"
    />

où encore, je peux mettre layout_height en tant que valeur valide (mais elle doit être présente en tant qu'attribut obligatoire).

Je n'ai jamais utilisé l'attribut height dans XML, mais je n'ai pas trouvé de différence dans les documents, en particulier dans le calcul de chacun d'eux lorsque l'élément sur lequel il opère a également des valeurs définies pour le remplissage et/ou la marge.

Existe-t-il des ressources disponibles pour en discuter ou quelqu'un peut-il l'expliquer ici?


Modifier (résumé des questions):

C’est peut-être la situation dans laquelle je l’ai utilisée, qui était à l’origine d’un problème, de sorte que mes exemples cités plus haut peuvent être ignorés (j’ai essayé dans un nouveau projet et obtenu des résultats différents des combinaisons d’attributs).

Mais mes questions initiales s'appliquent toujours (quelques chevauchements):

  1. quelle est la différence entre eux?
  2. quand faut-il utiliser l'un sur l'autre?
  3. l'utilisation de l'un affecte-t-elle l'utilisation de l'autre?
  4. est-ce que l'utilisation de one a des implications sur d'autres attributs qui peuvent contrôler les dimensions mesurées d'une vue, comme le remplissage ou la marge?

Edit 2 (un aparté):

Si cela peut aider à comprendre ma situation initiale par rapport au nouveau projet:

J'ai une activité qui définit windowActionBarOverlay sur true, donc mon contenu coule sous l'ActionBar (translucide).

J'utilise également des croûtons, qui apparaissent maintenant sous le ActionBar. Ben Weiss m'a suggéré de joindre le croûton à un autre groupe de vues, mais je ne savais pas à quel groupe de vues le joindre.

Au lieu de cela, j’ai fourni une vue personnalisée (qui est gonflée au besoin) sous la forme du Crouton (le TextView de la première partie de la question) avec un remplissage supérieur égal à celui de la barre d’action. Elle s'affiche donc verticalement sous la barre d’action. normal (avec d'autres problèmes pour un autre jour).

29
ataulm

Question 1:

Tous les attributs commençant par »layout_« sont des astuces pour le groupe de vues ViewGroup the View fait partie de. Pour cela, chaque Android.view.ViewGroup possède un ensemble de LayoutParams . Le widget lui-même ne les utilise pas.

Le paramètre Android:height est la taille initiale du Android.view.View. Mais si la vue est une partie ViewGroup, la ViewGroup redimensionnera l'objet en fonction de ses règles de présentation.

BTW: les nouvelles API ont un nouvel attribut Android:minHeight et Android:maxHeight afin de clarifier les intentions des programmeurs.

Notez que si vous ne définissez pas Android:height, la vue calculera la taille elle-même. Ce qui est la bonne chose à faire la plupart du temps.

Question 2:

ViewGroup est abstrait - la réponse à cette question dépend de la classe enfant que vous utilisez.

Notez que WRAP_CONTENT indique à utiliser ViewGroup pour utiliser Android:height. Ce qui signifie que c'est le paramètre correct à utiliser dans votre exemple.

Question 3:

Oui - et récursivement. TableLayout lira et écrira l'attribut Android:width pour trouver l'objet le plus large et redimensionner tous les autres objets.

Question 4:

Non pour Android:padding mais oui pour Android:layout_margin. Notez que les marges sont un paramètre de présentation et que tous les gestionnaires de présentation ne prennent pas en charge les marges.

Voir margin vs padding pour plus de détails.

Mots finaux:

Il est plus facile de considérer tous les attributs de largeur et de hauteur comme étant hints seulement. Le dernier mot de la taille d’un objet a le gestionnaire de disposition de la variable ViewGroup utilisée. 

21
Martin

Eh bien, Android_layout: height spécifie la hauteur de base de la vue alors qu'Android: height spécifie la hauteur de l'objet (par exemple, le bouton dans le xml). 

Bonne chance! :) 

0
tash

En jouant un peu avec cela, je pense que layout_height est flexible - une hauteur préférée mais continuera à être agrandi/réduit avec le contenu - et height est une valeur définie.

Ce qui se passe dans votre cas, c'est que TextView encapsule le texte Test tout en utilisant l'attribut 48dp paddingTop.

0
James Williams

Android: height fait que la vue soit exactement de cette hauteur alors qu'Android: layout_height spécifie la hauteur de base de la vue.

0
Pradeep