Warnung "Übergeben Sie keine Null als Ansichtsstamm", wenn Sie die Ansicht zur Verwendung durch AlertDialog aufblasen

126

Ich erhalte die Flusenwarnung, Avoid passing null as the view rootwenn ich Ansichten mit nullas aufblase parent, wie:

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

Die Ansicht soll jedoch als Inhalt von verwendet werden AlertDialog, wobei setViewon verwendet wird AlertDialog.Builder, sodass ich nicht weiß, was als die übergeben werden soll parent.

Was denkst du parentsollte das in diesem Fall sein?

Randy Sugianto 'Yuku'
quelle
2
Übergeben Sie false anstelle von null. siehe dies
MrDumb
Versuchen Sie, Ihr übergeordnetes Layout anstelle von null anzugeben, und verwenden Sie dann setView nicht.
Haresh Chhelana
Ich unterdrücke die Flusenwarnung für die Methode. Ich habe noch keinen guten Grund gesehen, warum ich nicht bestehen sollte null.
323go
4
Ich verstehe das Layoutproblem in Abhängigkeit von der übergeordneten Ansicht, aber das gilt nicht wirklich für einen AlertDialog, der im Wesentlichen über der Ansichtshierarchie der Aktivität schwebt. Deshalb können Sie bestehen null. Es gibt einen Grund, warum Sie Flusen unterdrücken können. Lint soll Sie vor häufig übersehenen Problemen warnen. In diesem Fall ist es der richtige Aufruf.
323go
1
@ ashutiwari4 Ich lerne jeden Tag neue neue Dinge .. schöne Welt: I
Rahul

Antworten:

174

Verwenden Sie diesen Code, um die Dialogansicht ohne Warnung aufzublasen:

View.inflate(context, R.layout.dialog_edit, null);
Edward Brey
quelle
7
@ MarianPaździoch Weil es keine Warnung verursacht. :-) Natürlich, das wirft die Frage auf , warum die Flusen Code behandelt View.inflateund LayoutInflator.inflateanders. Ich habe keine endgültige Antwort gesehen. Es kann damit zusammenhängen, warum es zwei scheinbar gleichwertige Möglichkeiten gibt, dieselbe Ansicht aufzublähen, für die ich auch keine Begründung gesehen habe.
Edward Brey
12
Das ist falsch. Es unterdrückt nur die Warnung, aber das Problem ist immer noch da. Lesen Sie possiblemobile.com/2013/05/layout-inflation-as-intended für eine bessere Lösung.
jcsahnwaldt Reinstate Monica
16
@JonaChristopherSahnwaldt Könnten Sie näher darauf eingehen? Der Artikel besagt, dass AlertDialog ein übergeordnetes Element haben sollte, da es keine Stammansicht hat. Mir scheint es zu verstärken, dass die Warnung für Ansichten außerhalb eines Dialogs sinnvoll ist, für eine Dialogansicht jedoch nicht gilt.
Edward Brey
7
@ EdwardBrey Du hast recht - ich habe den Artikel nicht gründlich gelesen. In diesem speziellen Fall ist es in Ordnung, entweder View.inflate(...null)oder zu verwenden @SuppressLint. Im Allgemeinen LayoutInflater.from(...).inflate(..., parent, false)ist besser. Vielen Dank für den Hinweis!
jcsahnwaldt Monica wieder einsetzen
1
@Bevor That Vermeiden Sie das Übergeben von Null- Fragen handelt von Fällen, in denen Sie einen Elternteil haben. Bei dieser Frage handelt es sich um ein AlertDialogübergeordnetes Element für die aufgeblasene Ansicht. Wenn Sie die Stammansicht von aufblasen AlertDialog, ist die Übergabe von null korrekt. Lint berücksichtigt diesen speziellen Kontext nicht, daher gibt die Warnung, die es gibt, wenn Sie die Funktion verwenden, die parentein falsches Positiv annimmt , keinen Hinweis auf etwas Fehleranfälliges. Aus diesem Grund ist es in diesem Fall gültig, die Funktion zu verwenden, die no parentakzeptiert und keine Warnung auslöst.
Edward Brey
35

Die Kurzgeschichte ist, dass beim Aufblasen einer Ansicht für einen Dialog parentnull sein sollte, da dies zum Zeitpunkt der Ansichtsinflation nicht bekannt ist. In diesem Fall haben Sie drei grundlegende Lösungen, um die Warnung zu vermeiden:

  1. Unterdrücken Sie die Warnung mit einer @Suppress
  2. Aufblasen Ansicht Ansicht der mit aufblasen Methode . Dies ist nur ein Wrapper um einen LayoutInflater und verschleiert das Problem meist nur.
  3. Blasen Sie die Ansicht mit der vollständigen Methode von LayoutInflater auf : inflate(int resource, ViewGroup root, boolean attachToRoot). Set attachToRootzufalse .Dieses erzählt die inflater , dass die Eltern nicht zur Verfügung steht. In älteren Versionen von Android Lint wurde die Warnung dadurch entfernt. Dies ist in Post 1.0-Versionen von Android Studio nicht mehr der Fall.

Unter http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ finden Sie eine ausführliche Diskussion zu diesem Thema, insbesondere den Abschnitt "Jede Regel hat eine Ausnahme" am Ende.

emerssso
quelle
19

Das Casting von null als ViewGroup löste die Warnung:

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

Wo liist das LayoutInflater'sObjekt?

SVL Narasimham
quelle
Dabei ist 'li' das LayoutInflater-Objekt.
SVL Narasimham
3
Diese Antwort ist die beste, vorausgesetzt, Sie verstehen, WARUM Sie dies tatsächlich tun. Wie Sie vielleicht bereits gelesen haben, ist die Kurzgeschichte, dass AlertDialog seine Eltern zum Zeitpunkt des Aufblasens nicht kennt. Daher ist es ein Nebeneffekt, dass Flusen in genau dieser Situation eine Warnung auslösen, wenn Sie tatsächlich das Richtige tun.
Mar Bar
Ich habe unzählige Antworten und Seiten über diese Warnung gelesen, aber Ihre Lösung ist bei weitem die beste: einfach und elegant
Couitchy
9
Aber es ist überflüssiges Casting
Mohit
11
Dann erhalten wir eine weitere Warnung "Casting ist überflüssig"!
Mousa
17

Du solltest benutzen AlertDialog.Builder.setView(your_layout_id) , damit Sie es nicht aufblasen müssen.

Verwenden AlertDialog.findViewById(your_view_id) nach dem Erstellen des Dialogs.

Verwenden Sie (AlertDialog) dialogInterface, um das dialogInnere der OnClickListenerund dann zu bekommen dialog.findViewById(your_view_id).

Jeffrey Chen
quelle
1
Dies ist der richtige Weg! Erstellen Sie einfach den Dialog und finden Sie Ihre Ansicht.
user1806772
1
Dies ist ein guter Weg, dies zu tun. Denken Sie jedoch daran, dass diese Methode in API 21
Nicolás Carrasco
Was ist, wenn wir dieses aufgeblasene Layout in einer Variablen speichern müssen? Zum Beispiel habe ich eine Klasse geschrieben, Ain der es die Methode gibt onCreateDialog. In letzterem habe ich geschrieben, wie du gesagt hast alert_dialog_builder.setView(R.layout.edit_account_dialog);. Aber ich muss dieses aufgeblasene Layout in der AAttributvariablen namens ' speichern the_inflated_layout_of_the_dialog.
JarsOfJam-Scheduler
9

Sie müssen parentfür ein Dialogfeld kein a angeben .

Unterdrücken Sie dies @SuppressLint("InflateParams")oben am Override.

kjdion84
quelle
7

Wenn Sie wirklich keine haben parent(zum Beispiel eine Ansicht für erstellen AlertDialog), haben Sie keine andere Wahl als zu übergeben null. Tun Sie dies, um Warnungen zu vermeiden:

final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);
Mousa
quelle
4
Es wird eine weitere Warnung ausgegeben: "Der Wert 'nullParent' ist immer null."
Mallaudin
Ab AndroidStudio 3.3 und API 28 ist dies die einzige Lösung, die funktioniert.
Zeeshan
1
  1. Der AlertDialog ist meines Wissens der einzige Fall, in dem Sie sicher null verwenden können anstelle einer übergeordneten Ansicht verwenden können. In diesem Fall können Sie die Warnung unterdrücken, indem Sie Folgendes verwenden:

    @ SuppressLint ("InflateParams")

  2. Im Allgemeinen sollten Sie niemals SupressLint oder eine der in den anderen Antworten genannten Problemumgehungen verwenden, um die Warnung zu entfernen. Die übergeordnete Ansicht ist erforderlich, um die Layoutparameter auszuwerten, die im Stammelement der aufgeblasenen Ansicht deklariert sind. Das heißt, wenn Sie anstelle der übergeordneten Ansicht null verwenden, werden alle Layoutparameter im Stammelement ignoriert und durch Standardlayoutparameter ersetzt. Meistens ist es in Ordnung, aber in einigen Fällen führt dies zu einem wirklich schwer zu findenden Fehler.

Apfelsaft
quelle
0

Aus der Dokumentation von View.inflate()heißt es

Blasen Sie eine Ansicht aus einer XML-Ressource auf. Diese bequeme Methode umschließt die LayoutInflaterKlasse, die eine vollständige Palette von Optionen zum Anzeigen der Inflation bietet.

  @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
quelle
0

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

Aufblasen und Festlegen des Layouts für das Dialogfeld Übergeben Sie
null als übergeordnete Ansicht, da es im Dialogfeldlayout angezeigt wird

Daher verwende ich zum Erstellen von AlertDialog @SuppressLint("InflateParams")

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

Anstatt zu tun

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

machen

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

Es wird mit dem angegebenen Elternteil aufgeblasen, aber nicht mit dem Elternteil verbunden.

Vielen Dank an Coeffect ( Link zu seinem Beitrag )

Christian
quelle
Es wäre auch nützlich zu wissen, wie man Eltern bekommt.
Johan Karlsson