Ich erhalte die Flusenwarnung, Avoid passing null as the view root
wenn ich Ansichten mit null
as aufblase parent
, wie:
LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);
Die Ansicht soll jedoch als Inhalt von verwendet werden AlertDialog
, wobei setView
on verwendet wird AlertDialog.Builder
, sodass ich nicht weiß, was als die übergeben werden soll parent
.
Was denkst du parent
sollte das in diesem Fall sein?
android
android-alertdialog
layout-inflater
Randy Sugianto 'Yuku'
quelle
quelle
null
.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.Antworten:
Verwenden Sie diesen Code, um die Dialogansicht ohne Warnung aufzublasen:
quelle
View.inflate
undLayoutInflator.inflate
anders. 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.View.inflate(...null)
oder zu verwenden@SuppressLint
. Im AllgemeinenLayoutInflater.from(...).inflate(..., parent, false)
ist besser. Vielen Dank für den Hinweis!AlertDialog
übergeordnetes Element für die aufgeblasene Ansicht. Wenn Sie die Stammansicht von aufblasenAlertDialog
, 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, dieparent
ein falsches Positiv annimmt , keinen Hinweis auf etwas Fehleranfälliges. Aus diesem Grund ist es in diesem Fall gültig, die Funktion zu verwenden, die noparent
akzeptiert und keine Warnung auslöst.Die Kurzgeschichte ist, dass beim Aufblasen einer Ansicht für einen Dialog
parent
null 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:Blasen Sie die Ansicht mit der vollständigen Methode von LayoutInflater auf :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.inflate(int resource, ViewGroup root, boolean attachToRoot)
. SetattachToRoot
zufalse
.Dieses erzählt die inflater , dass die Eltern nicht zur Verfügung steht.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.
quelle
Das Casting von null als ViewGroup löste die Warnung:
Wo
li
ist dasLayoutInflater's
Objekt?quelle
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 dasdialog
Innere derOnClickListener
und dann zu bekommendialog.findViewById(your_view_id)
.quelle
A
in der es die Methode gibtonCreateDialog
. In letzterem habe ich geschrieben, wie du gesagt hastalert_dialog_builder.setView(R.layout.edit_account_dialog);
. Aber ich muss dieses aufgeblasene Layout in derA
Attributvariablen namens ' speichernthe_inflated_layout_of_the_dialog
.Sie müssen
parent
für ein Dialogfeld kein a angeben .Unterdrücken Sie dies
@SuppressLint("InflateParams")
oben am Override.quelle
Wenn Sie wirklich keine haben
parent
(zum Beispiel eine Ansicht für erstellenAlertDialog
), haben Sie keine andere Wahl als zu übergebennull
. Tun Sie dies, um Warnungen zu vermeiden:quelle
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")
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.
quelle
Aus der Dokumentation von
View.inflate()
heißt esBlasen Sie eine Ansicht aus einer XML-Ressource auf. Diese bequeme Methode umschließt die
LayoutInflater
Klasse, die eine vollständige Palette von Optionen zum Anzeigen der Inflation bietet.quelle
Laut https://developer.android.com/guide/topics/ui/dialogs
Daher verwende ich zum Erstellen von AlertDialog
@SuppressLint("InflateParams")
quelle
Anstatt zu tun
machen
Es wird mit dem angegebenen Elternteil aufgeblasen, aber nicht mit dem Elternteil verbunden.
Vielen Dank an Coeffect ( Link zu seinem Beitrag )
quelle