Я получаю предупреждение о ворсе, Avoid passing null as the view root
когда надуваю представления с помощью null
as parent
, например:
LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);
Однако представление должно использоваться как содержимое AlertDialog
, используя setView
on AlertDialog.Builder
, поэтому я не знаю, что следует передавать как parent
.
Как вы думаете, что parent
должно быть в этом случае?
android
android-alertdialog
layout-inflater
Рэнди Сугианто 'Юку'
источник
источник
null
.null
. Есть причина, по которой вы можете подавить ворс. Lint должен предупреждать вас о часто упускаемых проблемах; в данном случае это правильный вызов.Ответы:
Используйте этот код для расширения диалогового окна без предупреждения:
источник
View.inflate
и по-LayoutInflator.inflate
другому. Я не видел однозначного ответа. Это может быть связано с тем, почему существует два, казалось бы, эквивалентных способа раздуть одно и то же представление, для чего я также не видел обоснования.View.inflate(...null)
или@SuppressLint
. В общем,LayoutInflater.from(...).inflate(..., parent, false)
лучше. Спасибо за указание на это!AlertDialog
, что не предоставляет родительский элемент для расширяемого представления. При раздутии корневого представления объектаAlertDialog
передача null является правильной. Lint не учитывает этот конкретный контекст, поэтому предупреждение, которое он выдает, если вы используете функцию, которая принимаетparent
ложное срабатывание, не указывает на что-либо, подверженное ошибкам. Вот почему в этом случае допустимо использовать функцию, которая не принимаетparent
и не вызывает предупреждения.Вкратце, когда вы увеличиваете представление для диалогового окна, оно
parent
должно иметь значение null, поскольку оно не известно во время наполнения представления. В этом случае у вас есть три основных решения, чтобы избежать предупреждения:Накачать View с помощью LayoutInflater в полный метод :В более старых версиях Android Lint это удалило предупреждение. В версиях Android Studio после 1.0 это уже не так.inflate(int resource, ViewGroup root, boolean attachToRoot)
. УстановитеattachToRoot
значение.false
Это означает, что надувной элемент недоступен.Посетите http://www.doubleencore.com/2013/05/layout-inflation-as-intended/, где подробно обсуждается этот вопрос, в частности, в конце раздела «Каждое правило имеет исключение».
источник
Приведение к нулю как ViewGroup разрешило предупреждение:
где
li
находитсяLayoutInflater's
объект.источник
Вы должны использовать
AlertDialog.Builder.setView(your_layout_id)
, поэтому вам не нужно его надувать.Используйте
AlertDialog.findViewById(your_view_id)
после создания диалога.Используйте,
(AlertDialog) dialogInterface
чтобы попастьdialog
внутрь,OnClickListener
а затемdialog.findViewById(your_view_id)
.источник
A
в котором есть методonCreateDialog
. В последнем я написал, как вы сказалиalert_dialog_builder.setView(R.layout.edit_account_dialog);
. Но я должен сохранить этот раздутый макет вA
переменной атрибута с именемthe_inflated_layout_of_the_dialog
.parent
Для диалогового окна указывать не нужно .Подавите это, используя
@SuppressLint("InflateParams")
в верхней части переопределения.источник
Когда у вас их действительно нет
parent
(например, создание представления дляAlertDialog
), у вас нет другого выбора, кроме как пройтиnull
. Итак, сделайте это, чтобы избежать предупреждения:источник
Насколько мне известно, AlertDialog - это единственный случай, когда вы можете безопасно использовать null вместо родительского представления. В этом случае вы можете подавить предупреждение, используя:
@SuppressLint ( "InflateParams")
В общем, вы никогда не должны использовать SupressLint или один из обходных путей, упомянутых в других ответах, чтобы избавиться от предупреждения. Родительское представление необходимо для оценки параметров макета, которые объявлены в корневом элементе расширяемого представления. Это означает, что если вы используете null вместо родительского представления, все параметры макета в корневом элементе будут проигнорированы и заменены параметрами макета по умолчанию. В большинстве случаев это нормально, но в некоторых случаях это приводит к действительно трудно обнаруживаемой ошибке.
источник
В документации
View.inflate()
говоритсяРаздуть представление из ресурса XML. Этот удобный метод является оболочкой для
LayoutInflater
класса, который предоставляет полный набор опций для просмотра инфляции.источник
Согласно https://developer.android.com/guide/topics/ui/dialogs
поэтому для создания AlertDialog я использую
@SuppressLint("InflateParams")
источник
Вместо того, чтобы делать
делать
Он раздувает его с помощью данного родителя, но не прикрепляет к нему.
Большое спасибо Coeffect ( ссылка на его пост )
источник