Fonctionnement de LayoutInflater / Android

Le LayoutInflater prend un fichier XML en entrée et construit des objets de vue à partir de celui-ci. Assez juste, nous avons compris ce que font LayoutInflater.

Voyons ce que LayoutInflater.le document inflate() dit et spécialement à propos de attachToRoot.

booléen : Si la hiérarchie gonflée doit être attachée au paramètre racine ? Si false, root est uniquement utilisé pour créer la sous-classe correcte de LayoutParams pour la vue racine dans le XML.

L’idée générale est la suivante: Si attachToRoot est défini sur true, le fichier de mise en page spécifié dans le premier paramètre est gonflé et attaché au groupe de vues spécifié dans le deuxième paramètre.

Lorsque attachToRoot a la valeur false, le fichier de mise en page du premier paramètre est gonflé et renvoyé sous forme de vue. Signifie que root est uniquement utilisé pour créer la sous-classe correcte de LayoutParams pour la vue racine (du premier paramètre) dans le XML.

Le passage de true pour attachToRoot entraîne l’ajout de la vue gonflée d’un fichier de mise en page au ViewGroup directement sur place. Le passage de false pour attachToRoot signifie que la vue créée à partir du fichier de mise en page sera ajoutée au groupe de vues d’une autre manière.

Décomposons-le en deux scénarios:

décomposez-le

attachToRoot Défini sur True

  • Imaginez que nous ayons spécifié un bouton dans un fichier de mise en page XML avec sa largeur de mise en page et sa hauteur de mise en page définies sur match_parent.
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/action_attach_to_root_true"
android:id="@+id/button_ok">
</Button>
  • Nous voulons maintenant ajouter par programmation ce bouton à une disposition linéaire à l’intérieur d’une Activité. Dans notre parent de variable membre LinearLayout, nous pouvons simplement ajouter le bouton avec ce qui suit:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
  • Nous avons spécifié que nous voulions gonfler le bouton à partir de son fichier de ressources de mise en page; nous indiquons ensuite au LayoutInflater que nous voulons l’attacher au parent. Nos paramètres de mise en page sont respectés car nous savons que le bouton est ajouté à un LinearLayout. Le type de paramètres de disposition du bouton doit être LinearLayout.Paramètres de mise en page.

2. attachToRoot Défini sur False

  • Regardons quand vous voudriez définir attachToRoot sur false. Dans ce scénario, la Vue spécifiée dans le premier paramètre de inflate() n’est pas attachée au groupe de vues dans le deuxième paramètre à ce stade. Rappelez-vous notre exemple de bouton précédent, où nous voulons attacher un bouton personnalisé à partir d’un fichier de mise en page au parent. Nous pouvons toujours attacher notre bouton au parent en passant false pour attachToRoot — nous l’ajoutons simplement manuellement par la suite.

Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
  • L’exemple false attachToRoot nécessite un peu plus de travail lorsque nous ajoutons manuellement la vue à un groupe de vues. Ajouter notre bouton à notre LinearLayout était plus pratique avec une ligne de code lorsque attachToRoot était vrai.
  • Regardons certains scénarios qui nécessitent absolument que attachToRoot soit faux. Les enfants de RecyclerView doivent être gonflés avec attachToRoot transmis comme faux. Les vues enfants sont gonflées dans onCreateViewHolder(). RecyclerViews, pas nous, est responsable de déterminer quand gonfler et présenter ses opinions d’enfants. Le paramètre attachToRoot doit être false chaque fois que nous ne sommes pas responsables de l’ajout d’une vue à un groupe de vues.
  • Il existe quelques scénarios dans lesquels vous n’aurez pas de groupe de vues racine à passer dans inflate(). Lors de la création d’une vue personnalisée pour un AlertDialog, vous n’avez pas encore accès à son parent.
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
LayoutInflater inflater = getActivity().getLayoutInflater();View rootView = inflater.inflate(R.layout.fragment_hello_dialog,null,false);builder.setView(rootView);
builder.setTitle("Alert");
builder.setPositiveButton("Ok", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});return builder.create();
  • Dans ce cas, il est correct de passer null pour le groupe de vues racine. Il s’avère que AlertDialog remplacerait de toute façon les LayoutParams par match_parent. Cependant, la règle générale est de transmettre le parent si vous êtes capable de le faire.

Donc pour récapituler:

  1. Si vous avez un parent à transmettre au paramètre root ViewGroup, faites-le.
  2. Essayez d’éviter de passer null pour le groupe de vues racine.
  3. Transmettez false pour le paramètre attachToRoot lorsque nous ne sommes pas responsables de la fixation de la Vue de notre fichier de mise en page à son groupe de vues racine.
  4. Ne transmettez pas true pour une vue qui a déjà été attachée à un groupe de vues.
  5. Les vues personnalisées sont un bon cas d’utilisation pour transmettre true pour attachToRoot.

Un merci spécial à Sean Farrel, à propos de son merveilleux article sur LayoutInflater ici, j’ai essayé de résumer en quelques mots.

Bon codage et écriture sur le codage!
Si vous avez trouvé cela utile, cliquez sur le 💚 ci-dessous. Suivez-moi pour plus d’articles sur la technologie.

You might also like

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.