Que signifie gonfler une vue à partir d'un fichier xml?

278

Je suis nouveau dans le développement Android et je continue à trouver des références aux vues gonflables à partir d'un fichier xml de mise en page. J'ai googlé et cherché dans le guide de développement, mais je n'ai toujours pas pu comprendre ce qu'il signifie. Si quelqu'un pouvait fournir un exemple très simple, ce serait très apprécié.

Brendan Weinstein
la source

Réponses:

257

Lorsque vous écrivez une disposition XML, elle sera gonflée par le système d'exploitation Android, ce qui signifie essentiellement qu'elle sera rendue en créant un objet de vue en mémoire. Appelons cela une inflation implicite (l'OS gonflera la vue pour vous). Par exemple:

class Name extends Activity{
    public void onCreate(){
         // the OS will inflate the your_layout.xml
         // file and use it for this activity
         setContentView(R.layout.your_layout);
    }
}

Vous pouvez également gonfler les vues de manière explicite en utilisant le LayoutInflater. Dans ce cas, vous devez:

  1. Obtenez une instance de la LayoutInflater
  2. Spécifiez le XML à gonfler
  3. Utilisez le retour View
  4. Définissez la vue du contenu avec la vue renvoyée (ci-dessus)

Par exemple:

LayoutInflater inflater = LayoutInflater.from(YourActivity.this); // 1
View theInflatedView = inflater.inflate(R.layout.your_layout, null); // 2 and 3
setContentView(theInflatedView) // 4
Cristian
la source
24
si gonfler = rendre, alors à quoi sert onDraw (), précisément?
PypeBros
@sylvainulg, La vue R.id. est utilisée pour changer les attributs de l'élément xml et gonfler peut faire de même. le gonflage est particulièrement utile dans les vues personnalisées. Pour gonfler l'intégralité du fichier xml, la classe setContentView of Activity familière est utilisée. Une vue doit gonfler chaque vue manuellement à l'aide de LayoutInflater object.inflate (). Une activité a un cycle de vie. Une vue a un cycle de dessin à la place. inflater est particulièrement utile avec une vue personnalisée au lieu d'utiliser une disposition prédéterminée dans un fichier XML.
Sree Rama
@Cristian S'il vous plaît, pensez-vous que vous pourriez me donner quelques conseils / idées ici goo.gl/E37NSu
eddy
24
Je ne pense pas que le gonflage soit un rendu plutôt que le gonflement est la création réelle d'un objet View en mémoire basé sur le contenu du fichier xml. Après le gonflage, la vue sera en mémoire pas nécessairement visible.
Ahmed
1
@MattJ. Eh bien, ma réponse pourrait être mal formulée. Android gonfle la vue non seulement en ayant le XML quelque part, mais lorsque vous appelez setContentView ou gonflez manuellement la mise en page. Au moment où vous appelez findViewByIdla vue, les objets sont déjà en mémoire, et la seule raison pour laquelle vous le faites est d'obtenir une référence à cet objet particulier (soit pour le modifier, soit pour en extraire des données).
Cristian
160

«Gonfler» une vue signifie prendre le XML de présentation et l'analyser pour créer les objets de vue et de groupe de vues à partir des éléments et de leurs attributs spécifiés à l'intérieur, puis ajouter la hiérarchie de ces vues et groupes de vues au ViewGroup parent. Lorsque vous appelez setContentView (), il attache les vues qu'il crée à partir de la lecture du XML à l'activité. Vous pouvez également utiliser LayoutInflater pour ajouter des vues à un autre ViewGroup, ce qui peut être un outil utile dans de nombreuses circonstances.

jjb
la source
22
cela ressemble à une description beaucoup plus précise pour moi.
PypeBros
4
Je suis toujours un peu confus par la terminologie "inflation" moi-même. (Si seulement je pouvais arrêter de voir de l'air entrer dans quelque chose). Mais peut-être que cela aidera: je viens d'exécuter le programme de décompression sur un terminal Ubuntu et j'ai remarqué la terminologie: "gonfler: X / Y / z.xml". Je suppose que c'est vraiment le même concept.
Ben Ogorek
6
"Gonfler" dans ce cas signifie que le framework prend la description de la mise en page du XML et remplit la hiérarchie de vues avec des objets View réels. Donc, ça gonfle dans le sens de remplir la mise en page.
jjb
1
@FranciscoCorrales - Bien sûr. La chose la plus courante pour laquelle vous utiliseriez ce genre de chose est pour quelque chose comme un ListAdapter , où vous souhaitez remplir une ligne. Je l'ai utilisé pour remplir des choses comme LinearLayouts, en itérant sur certains objets de données d'une manière qui ne suggérait pas l'approche ListAdapter.
jjb
36

Le gonflage est le processus d'ajout d'une vue (.xml) à l'activité lors de l'exécution. Lorsque nous créons une listView, nous gonflons chacun de ses éléments de manière dynamique. Si nous voulons créer un ViewGroup avec plusieurs vues comme les boutons et la vue de texte, nous pouvons le créer comme suit:

Button but = new Button();
but.setText ="button text";
but.background ...
but.leftDrawable.. and so on...

TextView txt = new TextView();
txt.setText ="button text";
txt.background ... and so on...

Ensuite, nous devons créer une mise en page où nous pouvons ajouter des vues ci-dessus:

RelativeLayout rel = new RelativeLayout();

rel.addView(but);

Et maintenant, si nous voulons ajouter un bouton dans le coin droit et une vue de texte en bas, nous devons faire beaucoup de travail. Tout d'abord en instanciant les propriétés de la vue, puis en appliquant plusieurs contraintes. Cela prend du temps.

Android nous permet de créer facilement un .xml simple et de concevoir son style et ses attributs en xml, puis de simplement le gonfler partout où nous en avons besoin sans avoir à définir des contraintes par programmation.

LayoutInflater inflater = 
              (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View menuLayout = inflater.inflate(R.layout.your_menu_layout, mainLayout, true);
//now add menuLayout to wherever you want to add like

(RelativeLayout)findViewById(R.id.relative).addView(menuLayout);
Zar E Ahmer
la source
J'aime la façon dont vous avez décrit ce qu'est réellement l'inflation, en montrant comment vous le feriez manuellement.
Daniel
1
Que signifie le paramètre inflate attachToRoot?
flz
Voir détail réponse stackoverflow.com/questions/12567578/…
Zar E Ahmer
5

Je pense qu'ici "gonfler une vue" signifie récupérer le fichier layout.xml en dessinant une vue spécifiée dans ce fichier xml et POPULER (= gonfler) le parent ViewGroup avec la vue créée.

Jaydeep Ranipa
la source
4

Une définition profane de l'inflation pourrait être de convertir le code XML en code Java. Juste une façon de comprendre, par exemple, si nous avons une balise en XML, le système d'exploitation doit créer un objet Java correspondant en mémoire, donc inflatter lit les XMLtags et crée les objets correspondants en Java.

user3458211
la source
2

Parce que nous transformons l'interface utilisateur en XML mais que les objets de vue sont ce que nous affichons, nous devons en quelque sorte convertir le xml en objets de vue, ce qui signifie que nous gonflons convertissons le xml en objets de vue afin qu'il puisse être affiché, pour cela, nous avons besoin d'un service appelé service de gonflage de mise en page et lui donner un xml et il sera converti pour vous.

blackHawk
la source