J'ai eu de sérieux problèmes pour faire fonctionner LayoutInflater comme prévu, tout comme d'autres personnes: Comment utiliser layoutinflator pour ajouter des vues au moment de l'exécution? .
Pourquoi LayoutInflater ignore-t-il les paramètres de mise en page que j'ai spécifiés? Par exemple, pourquoi les valeurs layout_width
et layout_height
de mes ressources XML ne sont-elles pas respectées?
android
android-layout
Andig
la source
la source
Réponses:
J'ai étudié ce problème, en me référant aux documents LayoutInflater et en configurant un petit exemple de projet de démonstration. Les didacticiels suivants montrent comment remplir dynamiquement une mise en page à l'aide de
LayoutInflater
.Avant de commencer, voyez à quoi
LayoutInflater.inflate()
ressemblent les paramètres:R.layout.main_page
)attachToRoot
esttrue
), ou bien simplement un objet qui fournit un ensemble deLayoutParams
valeurs pour la racine de la hiérarchie retournée (siattachToRoot
estfalse
.)attachToRoot : si la hiérarchie gonflée doit être attachée au paramètre racine? Si false, root n'est utilisé que pour créer la sous-classe correcte de
LayoutParams
pour la vue racine dans le XML.Renvoie : La vue racine de la hiérarchie gonflée. Si root a été fourni et l'
attachToRoot
esttrue
, c'est root; sinon, c'est la racine du fichier XML gonflé.Maintenant, pour l'exemple de mise en page et de code.
Disposition principale (
main.xml
):Un TextView séparé est ajouté à ce conteneur, visible sous forme de petit carré rouge si les paramètres de mise en page sont correctement appliqués à partir de XML (
red.xml
):Maintenant
LayoutInflater
est utilisé avec plusieurs variantes de paramètres d'appelLes résultats réels des variations de paramètres sont documentés dans le code.
SYNOPSIS: Appeler
LayoutInflater
sans spécifier la racine conduit à gonfler l'appel en ignorant les paramètres de mise en page du XML. L'appel de inflate avec root n'est pas égalnull
etattachRoot=true
charge les paramètres de mise en page, mais renvoie à nouveau l'objet racine, ce qui empêche d'autres modifications de mise en page de l'objet chargé (à moins que vous ne puissiez le trouver en utilisantfindViewById()
). La convention d'appel que vous aimeriez probablement utiliser est donc celle-ci:Pour résoudre les problèmes de mise en page, l' inspecteur de mise en page est fortement recommandé.
la source
Activity
est une sous-classe deContext
et les exemples de réponse sont dans la portée deActivity
, donc pour simplifier, j'ai remplacégetBaseContext()
parthis
as, pour les besoins de cette réponse, c'est équivalent.andig est correct qu'une raison courante pour LayoutInflater d'ignorer vos layout_params serait parce qu'une racine n'a pas été spécifiée. Beaucoup de gens pensent que vous pouvez passer null pour root. Ceci est acceptable pour quelques scénarios tels qu'une boîte de dialogue, où vous n'avez pas accès à la racine au moment de la création. Une bonne règle à suivre, cependant, est que si vous avez root, donnez-le à LayoutInflater.
J'ai écrit un article de blog approfondi à ce sujet que vous pouvez consulter ici:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
la source
This is acceptable for a few scenarios such as a dialog
c'était tout ce dont j'avais besoinje veux ajouter à la réponse principale ci-dessus
j'ai essayé de la suivre mais mon recyclerView a commencé à étirer chaque élément sur un écran que
je devais ajouter la ligne suivante après avoir gonflé pour atteindre l'objectif
J'ai déjà ajouté ces paramètres par xml mais cela ne fonctionnait pas correctement
et avec cette ligne tout va bien
la source