web-dev-qa-db-fra.com

Avertissement "Évitez de passer à null en tant que racine de la vue" lors du gonflage de la vue pour utilisation par AlertDialog

Je reçois le message de peluches, Avoid passing null as the view root lorsqu’on gonfle des vues avec null comme parent, comme:

LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);

Cependant, la vue doit être utilisée comme contenu d'un AlertDialog, en utilisant setView sur AlertDialog.Builder, donc je ne sais pas ce qui devrait être passé en tant que parent.

Que pensez-vous que le parent devrait être dans ce cas?

106

Utilisez ce code pour gonfler la vue de dialogue sans avertissement:

View.inflate(context, R.layout.dialog_edit, null);
152
Edward Brey

En résumé, lorsque vous gonflez une vue pour une boîte de dialogue, parent devrait être nul, car elle n’est pas connue au moment de l’inflation de la vue. Dans ce cas, vous avez trois solutions de base pour éviter l'avertissement:

  1. Supprimer l'avertissement à l'aide d'un @Suppress
  2. Gonflez la vue en utilisant la méthode de gonflage de View . Ceci est juste une enveloppe autour d'un LayoutInflater, et la plupart du temps obfusque le problème.
  3. Gonflez la vue en utilisant la méthode complète de LayoutInflater : inflate(int resource, ViewGroup root, boolean attachToRoot). Définissez attachToRoot sur false. Cela indique au système d'inflation que le parent n'est pas disponible. Dans les anciennes versions de Android Lint, l'avertissement a été supprimé. Ce n'est plus le cas dans les versions post 1.0 de Android Studio.

Consultez http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ pour une bonne discussion sur ce sujet, spécifiquement la section "Chaque règle a une exception" à la fin.

31
emerssso

La conversion de null en ViewGroup a résolu l'avertissement suivant:

View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);

li est le LayoutInflater's objet.

17
SVL Narasimham

Vous devez utiliser AlertDialog.Builder.setView(your_layout_id), de sorte que vous n'avez pas besoin de le gonfler.

Utilisez AlertDialog.findViewById(your_view_id) après avoir créé le dialogue.

Utilisez (AlertDialog) dialogInterface Pour obtenir le dialog à l'intérieur du OnClickListener puis dialog.findViewById(your_view_id).

14
Jeffrey Chen

Lorsque vous n'avez vraiment pas de parent (par exemple, créer une vue pour AlertDialog), vous n'avez pas d'autre choix que de passer null. Alors faites ceci pour éviter les avertissements:

final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);
7
Mousa

Vous n'avez pas besoin de spécifier un parent pour un dialogue.

Supprimez cela en utilisant @SuppressLint("InflateParams") en haut du remplacement.

7
kjdion84
  1. Pour autant que je sache, AlertDialog est le seul cas où vous pouvez utiliser en toute sécurité null au lieu d'une vue parent. Dans ce cas, vous pouvez supprimer l'avertissement en utilisant:

    @SuppressLint ("InflateParams")

  2. En général, vous ne devez jamais utiliser SupressLint ou l’une des solutions de contournement mentionnées dans les autres réponses pour vous débarrasser de l’avertissement. La vue parent est nécessaire pour évaluer les paramètres de présentation déclarés dans l'élément racine de la vue en cours de gonflage. Cela signifie que si vous utilisez null à la place de la vue parent, tous les paramètres de présentation de l'élément racine seront ignorés et remplacés par les paramètres de présentation par défaut. La plupart du temps, tout ira bien, mais dans certains cas, il en résultera un bogue très difficile à trouver.

1
Apfelsaft