Під час попередження надуття подання для використання AlertDialog "Уникайте передачі нуля як коріння перегляду"


126

Я отримую попередження про ворсинки, Avoid passing null as the view rootколи надуваю погляди nullтаким чином parent, як:

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

Тим НЕ менше, вид повинен бути використаний в якості змісту AlertDialog, використовуючи setViewна AlertDialog.Builder, так що я не знаю , що повинно бути передано як parent.

Що, на вашу думку, parentмає бути в цьому випадку?


2
Передайте false замість null. дивіться це
MrDumb

Спробуйте надати вам батьківський макет замість null, а потім не використовуйте setView.
Хареш Чхелана

Я пригнічую попередження ворсу для методу. Я ще не бачив вагомих причин, чому я не повинен пройти null.
323го

4
Я розумію проблему з компонуванням залежно від батьківського подання, але це дійсно не стосується AlertDialog, який по суті плаває над ієрархією подання діяльності. Ось чому можна пройти null. Є причина, що ви можете придушити ворсинки. Лінт повинен давати вам попередження щодо часто пропущених питань; у цьому випадку це правильне виклик.
323го

1
@ ashutiwari4 Я щодня вчу нових нових речей .. прекрасний світ: Я
Рахул

Відповіді:


175

Використовуйте цей код, щоб надути діалогове вікно без попередження:

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

7
@ MarianPaździoch Тому що це не викликає попередження. :-) Звичайно, тут виникає питання про те, чому трактується код "lint" View.inflateі LayoutInflator.inflateінакше. Я не бачив остаточної відповіді. Це може бути пов'язано з тим, чому існує два, здавалося б, рівнозначні способи надути один і той же погляд, для яких я також не бачив обгрунтування.
Едвард Брей

12
Це неправильно. Це лише пригнічує попередження, але проблема все ж є. Прочитайте mogućemobile.com/ 2013/ 05/ layout- inflation- as- призначений для кращого рішення.
jcsahnwaldt Відновлення Моніки

16
@JonaChristopherSahnwaldt Не могли б ви детальніше розробитись? У статті йдеться про те, що AlertDialog повинен мати батьківський нуль, оскільки він не має кореневого виду. Мені здається, це підкреслює, що попередження має сенс для переглядів поза діалогом, але не застосовується для діалогу.
Едвард Брей

7
@EdwardBrey Ви маєте рацію - я старанно не читав статтю. У цьому конкретному випадку нормально використовувати або View.inflate(...null)або @SuppressLint. Загалом, LayoutInflater.from(...).inflate(..., parent, false)краще. Дякуємо, що вказали на це!
jcsahnwaldt Відновити Моніку

1
@Bevor That Avoid, що не ставить нульового питання, стосується випадків, коли у вас є батько. Це питання про те AlertDialog, що не забезпечує жодного з батьків для завищеного перегляду. Підвищуючи подання кореня на an AlertDialog, передача нуля правильна. Lint не враховує цей конкретний контекст, тому попередження, яке воно дає, якщо ви використовуєте функцію, яка приймає parentпомилковий позитив, а не вказує на будь-яку схильність до помилок. Ось чому в цьому випадку справедливо використовувати функцію, яка не приймає parentі не запускає попередження.
Едвард Брей

35

Коротка історія полягає в тому, що, коли ви надуваєте подання для діалогу, це parentмає бути недійсним, оскільки це не відомо в час перегляду інфляції. У цьому випадку у вас є три основні рішення, щоб уникнути попередження:

  1. Придушіть попередження за допомогою @Suppress
  2. Накачати View з використанням виду в надути метод . Це просто обгортка навколо LayoutInflater, і в основному це просто придушує проблему.
  3. Накачати View з допомогою LayoutInflater в повний метод : inflate(int resource, ViewGroup root, boolean attachToRoot). Встановити attachToRootзначення false. Це говорить інфлятору, що батьків немає. У старих версіях Android Lint це попередження видалено. У пост-версіях Android Studio більше не так.

Перегляньте http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ для великого обговорення цього питання, зокрема розділу "Кожне правило має виняток" наприкінці.


19

Передача нуля, коли ViewGroup вирішив попередження:

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

де liце LayoutInflater'sоб'єкт.


де 'li' - об’єкт LayoutInflater.
SVL Narasimham

3
Ця відповідь найкраща, якщо ви зрозумієте, ЧОМУ ви насправді це робите. Коротка історія, як ви, можливо, вже читали, полягає в тому, що AlertDialog не знає свого батька в завищений час, і тому саме побічний ефект, який вкладає попередження в цій точній ситуації, коли ви насправді робите правильно.
Бар Бар

Я прочитав незліченну кількість відповідей та сторінок про це попередження, але ваше рішення найкраще на сьогодні: просте та елегантне
Couitchy

9
Але це зайвий кастинг
mohit

11
Тоді ми отримуємо ще одне попередження "Кастинг зайвий"!
Муса

17

Ви повинні використовувати AlertDialog.Builder.setView(your_layout_id), так що вам не потрібно надувати його.

Використовувати AlertDialog.findViewById(your_view_id)після створення діалогового вікна.

Використовуйте, (AlertDialog) dialogInterfaceщоб потрапити dialogвсередину OnClickListenerі потім dialog.findViewById(your_view_id).


1
Це шлях! Просто створіть діалогове вікно і знайдіть свій погляд.
user1806772

1
Це хороший спосіб зробити це, проте пам’ятайте, що цей метод був доданий в API 21
Nicolás Carrasco,

Що робити, якщо ми повинні зберігати цей надутий макет у якійсь змінній? Наприклад, я написав клас, Aу якому є метод onCreateDialog. В останньому я писав так, як сказав alert_dialog_builder.setView(R.layout.edit_account_dialog);. Але я повинен зберігати цей завищений макет у Aзмінній атрибута 's з назвою the_inflated_layout_of_the_dialog.
JarsOfJam-Scheduler

9

Не потрібно вказувати parentдіалогове вікно.

Придушіть це, скориставшись @SuppressLint("InflateParams")у верхній частині зміни.


7

Якщо у вас насправді немає жодного parent(наприклад, створити перегляд для AlertDialog), у вас немає іншого вибору, крім проходження null. Тому робіть це, щоб уникнути попередження:

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

4
Це створює ще одне попередження "значення 'nullParent' завжди є нульовим."
mallaudin

Що стосується AndroidStudio 3.3 та API 28, це єдине рішення з роботами.
Zeeshan

1
  1. Наскільки я знаю, AlertDialog є єдиним випадком, коли ви можете сміливо використовувати null замість подання батьків. У цьому випадку ви можете придушити попередження, використовуючи:

    @SuppressLint ("InflateParams")

  2. Як правило, ніколи не слід використовувати SupressLint або один із способів вирішення, згаданих в інших відповідях, щоб позбутися від попередження. Батьківський вигляд необхідний для оцінки параметрів макета, які оголошені в завищеному кореневому елементі Перегляду. Це означає, що якщо ви використовуєте null замість батьківського перегляду, всі параметри макета в кореневому елементі будуть ігноровані та замінені параметрами макета за замовчуванням. Більшу частину часу це буде добре, але в деяких випадках це призведе до дійсно важко знайти помилку.


0

З документації про View.inflate(), йдеться

Надуйте подання з XML-ресурсу. Цей зручний метод охоплює LayoutInflaterклас, який надає повний спектр варіантів перегляду інфляції.

  @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.

0

Відповідно до https://developer.android.com/guide/topics/ui/dialogs

Надуйте та встановіть макет для діалогового вікна
Pass null як батьківський вигляд, оскільки його відбувається в діалоговому макеті

тому для створення AlertDialog я використовую @SuppressLint("InflateParams")

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

-1

Замість того, щоб робити

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

робити

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

Це надує його даним батьком, але не приєднає його до батьківського.

Велике спасибі Coeffect ( посилання на його повідомлення )


Також було б корисно знати, як стати батьком.
Йохан Карлссон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.