扩大供AlertDialog使用的视图时,“避免将null作为视图根传递”警告


126

Avoid passing null as the view root当使用nullas 扩大视图时,我会收到棉绒警告parent,例如:

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

但是,该视图将用作on 的内容AlertDialog,使用setViewon AlertDialog.Builder,所以我不知道应将什么作为the传递parent

您认为parent在这种情况下应该怎么办?


2
传递false而不是null。看到这个
MrDumb

尝试给您父级布局而不是null,然后不要使用setView。
Haresh Chhelana 2014年

我取消了该方法的棉绒警告。我还没有看到我不应该通过的充分原因null
323go 2014年

4
我了解取决于父视图的布局问题,但这实际上不适用于基本上漂浮在Activity的视图层次之上的AlertDialog。这就是为什么你可以通过null。您可以抑制皮棉是有原因的。Lint应该为您经常遇到的问题提供警告;在这种情况下,它是正确的调用。
323go 2014年

1
@ ashutiwari4我每天都在学习新事物..美丽的世界:I
Rahul

Answers:


174

使用此代码可在没有警告的情况下使对话框视图膨胀:

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

7
@MarianPaździoch,因为它不会引起警告。:-)当然,这引出了为什么皮棉代码对待View.inflateLayoutInflator.inflate区别对待的问题。我还没有确切的答案。这可能与为什么有两种看似等效的方法来夸大同一观点有关,而我也没有看到理由。
爱德华·布雷

12
错了 它仅抑制警告,但问题仍然存在。请按可能的方式阅读possiblemobile.com/2013/05/layout-inflation-as,以获得更好的解决方案。
jcsahnwaldt恢复莫妮卡2015年

16
@JonaChristopherSahnwaldt您能详细说明吗?文章说AlertDialog应该有一个空的父级,因为它没有根视图。在我看来,该警告似乎更适用于对话框外部的视图,但不适用于对话框视图。
爱德华·布雷

7
@EdwardBrey你是对的-我没有读完这篇文章。在这种情况下,可以使用View.inflate(...null)@SuppressLint。总的来说LayoutInflater.from(...).inflate(..., parent, false)更好。感谢您指出了这一点!
jcsahnwaldt恢复莫妮卡2015年

1
@Bevor 避免传递null问题是关于您有父母的情况。这个问题是关于AlertDialog,它没有为正在膨胀的视图提供父级。扩大的根视图时AlertDialog,传递null是正确的。Lint并没有考虑到这种特定的上下文,因此,如果您使用的函数parent误报肯定会发出警告,而不是表示容易出错。这就是为什么在这种情况下使用不接受且不parent触发警告的函数是有效的原因。
爱德华·布雷

35

简短的故事是,当您为对话框放大视图时,parent应该为null,因为在“视图膨胀”时间不知道该视图。在这种情况下,您可以通过三种基本解决方案来避免出现此警告:

  1. 使用@Suppress禁止警告
  2. 使用View的inflate方法为 View 充气。这只是LayoutInflater的包装,并且大多只是使问题难以理解。
  3. 使用充气LayoutInflater的查看完整的方法inflate(int resource, ViewGroup root, boolean attachToRoot)。设置attachToRootfalse。这告诉充气机父母不可用。在较旧版本的Android Lint中,这消除了警告。在Android Studio的1.0版之后,情况不再如此。

请查看http://www.doubleencore.com/2013/05/layout-inflation-as-intended/,以获取有关此问题的精彩讨论,特别是最后的“每个规则都有例外”部分。


19

在ViewGroup中强制为null可以解决警告:

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

其中liLayoutInflater's对象。


其中“ li”是LayoutInflater对象。
SVL Narasimham

3
这个答案是最好的,前提是您了解为什么要这样做。简短的故事,如您可能已经读过的那样,是AlertDialog在膨胀时不知道其父对象,因此,当您实际上在做正确的事情时,皮棉会在这种精确的情况下发出警告,这是一个副作用。
Mar Bar

我已经阅读了无数关于此警告的答案和页面,但您的解决方案是迄今为止最好的:简单而优雅
Couitchy

9
但这是多余的演员
mohit

11
然后,我们收到另一个警告“铸造是多余的”!
Mousa

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加入
尼古拉斯卡拉斯科

如果必须将这种膨胀的布局存储在某个变量中怎么办?例如,我写了一个类A,其中有method onCreateDialog。在后者中,我写的是欧文所说的alert_dialog_builder.setView(R.layout.edit_account_dialog);。但是我必须将这种膨胀的布局存储在A名为的属性变量中the_inflated_layout_of_the_dialog
JarsOfJam-Scheduler,

9

您无需parent为对话框指定。

使用@SuppressLint("InflateParams")替代顶部的来抑制此行为。


7

当您确实没有任何其他对象parent(例如为创建视图AlertDialog)时,除了pass之外别无选择null。因此,这样做可以避免警告:

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

4
它产生另一个警告“值'nullParent'始终为null”。
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

膨胀并设置对话框的布局将
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(链接到他的帖子


知道如何成为父母也很有用。
约翰·卡尔森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.