Avertissement "Évitez de transmettre null comme racine de la vue" lors du gonflement de la vue à utiliser par AlertDialog

126

Je reçois l'avertissement de peluche, Avoid passing null as the view rootlorsque je gonfle des vues avec nullcomme 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 setViewon AlertDialog.Builder, donc je ne sais pas ce qui devrait être passé en tant que parent.

Que pensez-vous que parentdevrait être dans ce cas?

Randy Sugianto 'Yuku'
la source
2
Passez false au lieu de null. voir ça
MrDumb
Essayez de vous donner une mise en page parent au lieu de null, puis n'utilisez pas setView.
Haresh Chhelana
Je supprime l'avertissement de peluche pour la méthode. Je n'ai pas encore vu une bonne raison pour laquelle je ne devrais pas passer null.
323go
4
Je comprends le problème de mise en page en fonction de la vue parente, mais cela ne s'applique pas vraiment à un AlertDialog qui flotte essentiellement au-dessus de la hiérarchie des vues de l'activité. C'est pourquoi vous pouvez réussir null. Il y a une raison pour laquelle vous pouvez supprimer les peluches. Lint est censé vous avertir des problèmes souvent manqués; dans ce cas, c'est une invocation correcte.
323go
1
@ ashutiwari4 J'apprends de nouvelles choses tous les jours .. beau monde: I
Rahul

Réponses:

175

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

View.inflate(context, R.layout.dialog_edit, null);
Edward Brey
la source
7
@ MarianPaździoch Parce que cela ne provoque pas d'avertissement. :-) Bien sûr, cela soulève la question de savoir pourquoi le code lint traite View.inflateet LayoutInflator.inflatedifféremment. Je n'ai pas vu de réponse définitive. Cela peut être lié à la raison pour laquelle il existe deux façons apparemment équivalentes de gonfler le même point de vue, pour lesquelles je n'ai pas non plus vu de justification.
Edward Brey
12
C'est faux. Il supprime seulement l'avertissement, mais le problème est toujours là. Lisez possiblemobile.com/2013/05/layout-inflation-as-intended pour une meilleure solution.
jcsahnwaldt Réintègre Monica
16
@JonaChristopherSahnwaldt Pourriez-vous élaborer? L'article indique que AlertDialog doit avoir un parent nul car il n'a pas de vue racine. Pour moi, cela semble renforcer le fait que l'avertissement a du sens pour les vues en dehors d'une boîte de dialogue mais n'est pas applicable pour une vue de boîte de dialogue.
Edward Brey
7
@EdwardBrey Vous avez raison - je n'ai pas lu l'article en détail. Dans ce cas particulier, vous pouvez utiliser soit View.inflate(...null)ou @SuppressLint. En général, LayoutInflater.from(...).inflate(..., parent, false)c'est mieux. Merci de l'avoir signalé!
jcsahnwaldt Réintègre Monica
1
@Bevor That Évitez de passer une question nulle concerne les cas où vous avez un parent. Cette question porte sur AlertDialog, qui ne fournit aucun parent pour la vue gonflée. Lors du gonflement de la vue racine d'un AlertDialog, la transmission de null est correcte. Lint ne tient pas compte de ce contexte particulier, donc l'avertissement qu'il donne si vous utilisez la fonction qui prend parentun faux positif, pas une indication de quoi que ce soit sujet aux erreurs. C'est pourquoi il est valide dans ce cas d'utiliser la fonction qui prend non parentet ne déclenche aucun avertissement.
Edward Brey
35

La petite histoire est que lorsque vous gonflez une vue pour une boîte de dialogue, parentdoit être nulle, 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 à l'aide de la méthode de gonflage de View . Ceci est juste un wrapper autour d'un LayoutInflater, et principalement obscurcit le problème.
  3. Gonflez la vue à l' aide de LayoutInflater complète méthode : inflate(int resource, ViewGroup root, boolean attachToRoot). Réglé attachToRootsur false.Cela indique au gonfleur que le parent n'est pas disponible. Dans les anciennes versions d'Android Lint, cela supprimait l'avertissement. Ce n'est plus le cas dans les versions post 1.0 d'Android Studio.

Consultez http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ pour une grande discussion sur ce problème, en particulier la section «Chaque règle a une exception» à la fin.

emerssso
la source
19

Le cast de null en tant que ViewGroup a résolu l'avertissement:

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

liest l' LayoutInflater'sobjet.

SVL Narasimham
la source
où 'li' est l'objet LayoutInflater.
SVL Narasimham
3
Cette réponse est la meilleure, à condition que vous compreniez POURQUOI vous faites réellement cela. La petite histoire, comme vous l'avez peut-être déjà lu, est qu'AlertDialog ne connaît pas son parent au moment du gonflement, et c'est donc un effet secondaire que la charpie jette un avertissement dans cette situation précise lorsque vous faites réellement la bonne chose.
Mar Bar
J'ai lu d'innombrables réponses et pages sur cet avertissement, mais votre solution est de loin la meilleure: simple et élégante
Couitchy
9
Mais c'est un casting redondant
mohit
11
Ensuite, nous recevons un autre avertissement "Le casting est redondant"!
Mousa le
17

Vous devriez l'utiliser AlertDialog.Builder.setView(your_layout_id), vous n'avez donc pas besoin de le gonfler.

À utiliser AlertDialog.findViewById(your_view_id)après la création de la boîte de dialogue.

Utilisez (AlertDialog) dialogInterfacepour obtenir l' dialogintérieur du OnClickListenerpuis dialog.findViewById(your_view_id).

Jeffrey Chen
la source
1
C'est la voie à suivre! Créez simplement la boîte de dialogue, puis trouvez votre vue.
user1806772
1
C'est un bon moyen de le faire, mais rappelez-vous que cette méthode a été ajoutée dans l'API 21
Nicolás Carrasco
Et si nous devions stocker cette mise en page gonflée dans une variable? Par exemple, j'ai écrit une classe Adans laquelle il y a la méthode onCreateDialog. Dans ce dernier, j'ai écrit comme tu l'as dit alert_dialog_builder.setView(R.layout.edit_account_dialog);. Mais je dois stocker cette mise en page gonflée dans la Avariable d 'attribut nommée the_inflated_layout_of_the_dialog.
JarsOfJam-Scheduler
9

Vous n'avez pas besoin de spécifier un parentpour une boîte de dialogue.

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

kjdion84
la source
7

Quand vous n'en avez vraiment pas 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);
Mousa
la source
4
Il produit un autre avertissement "la valeur 'nullParent' est toujours nulle."
mallaudin
À partir d'AndroidStudio 3.3 et de l'API 28, c'est la seule solution qui fonctionne.
zeeshan
1
  1. Le AlertDialog est pour autant que je sache 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 parente est nécessaire pour évaluer les paramètres de mise en page qui sont déclarés dans l'élément racine de la vue gonflée. Cela signifie que si vous utilisez null au lieu de la vue parente, tous les paramètres de mise en page de l'élément racine seront ignorés et remplacés par les paramètres de mise en page par défaut. La plupart du temps, ce sera bien, mais dans certains cas, cela entraînera un bogue vraiment difficile à trouver.

Apfelsaft
la source
0

D'après la documentation de View.inflate(), il est dit

Gonflez une vue à partir d'une ressource XML. Cette méthode pratique englobe la LayoutInflaterclasse, qui fournit une gamme complète d'options pour l'inflation de vue.

  @param context The Context object for your activity or application.
  @param resource The resource ID to inflate
  @param root A view group that will be the parent.  Used to properly inflate the  layout_* parameters.
Divya Gupta
la source
0

Selon https://developer.android.com/guide/topics/ui/dialogs

Gonflez et définissez la mise en page de la boîte de dialogue
Passez null comme vue parente car elle va dans la présentation de la boîte de dialogue

par conséquent, pour créer AlertDialog, j'utilise @SuppressLint("InflateParams")

LayoutInflater inflater = requireActivity().getLayoutInflater();
@SuppressLint("InflateParams")
View view = inflater.inflate(R.layout.layout_dialog, null);
builder.setView(view);
Cor
la source
-1

Au lieu de faire

view = inflater.inflate(R.layout.list_item, null);

faire

view = inflater.inflate(R.layout.list_item, parent, false);

Cela le gonflera avec le parent donné, mais ne l'attachera pas au parent.

Un grand merci à Coeffect ( lien vers son article )

Christian
la source
Il serait également utile de savoir comment obtenir un parent.
Johan Karlsson