"避免传递null作为视图根"警告在膨胀视图以供AlertDialog使用时

Ran*_*ku' 111 android layout-inflater android-alertdialog

Avoid passing null as the view root当用nullas 膨胀视图时,我得到了lint警告parent,例如:

LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);
Run Code Online (Sandbox Code Playgroud)

但是,视图是用作一个内容AlertDialog,使用setViewon AlertDialog.Builder,所以我不知道应该传递什么parent.

parent在这种情况下你认为应该是什么?

Edw*_*rey 156

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

View.inflate(context, R.layout.dialog_edit, null);
Run Code Online (Sandbox Code Playgroud)

  • @JonaChristopherSahnwaldt你能详细说说吗?文章说AlertDialog应该有一个null父,因为它没有root视图.对我来说,似乎强调警告对于对话外的视图有意义,但不适用于对话视图. (14认同)
  • 这是错的.它只会抑制警告,但问题仍然存在.请阅读http://possiblemobile.com/2013/05/layout-inflation-as-intended/以获得更好的解决方案. (10认同)
  • @MarianPaździoch因为它不会引起警告.:-)当然,这引出了为什么lint代码以不同方式处理`View.inflate`和`LayoutInflator.inflate`的问题.我没有看到明确的答案.这可能与为什么有两种看似相同的方法来夸大相同的观点有关,为此我也没有看到理由. (7认同)
  • @EdwardBrey你是对的 - 我没有彻底阅读这篇文章.在这种特殊情况下,可以使用```View.inflate(... null)```或```@ SuppressLint```.一般来说,```LayoutInflater.from(...).inflate(...,parent,false)```更好.感谢您指出了这一点! (6认同)
  • @Bevor [避免传递 null](/sf/answers/1738279861/) 的问题是关于您有父母的情况。这个问题是关于`AlertDialog`,它没有为被膨胀的视图提供父级。在扩充“AlertDialog”的根视图时,传递 null 是正确的。Lint 没有考虑到这个特定的上下文,因此如果您使用将 `parent` 视为误报的函数,它会给出警告,而不是任何容易出错的迹象。这就是为什么在这种情况下使用不接受 `parent` 并且不触发警告的函数是有效的。 (3认同)

eme*_*sso 33

简短的故事是,当您为对话框充气视图时,parent应为null,因为在View通胀时间不知道.在这种情况下,您有三个基本解决方案来避免警告:

  1. 使用@Suppress抑制警告
  2. 使用View的inflate方法为视图充气.这只是LayoutInflater的一个包装器,大多只是模糊了这个问题.
  3. 使用LayoutInflater的完整方法为视图充气:inflate(int resource, ViewGroup root, boolean attachToRoot).设置attachToRootfalse.这告诉inflater父母不可用.在早期版本的Android Lint中,这删除了警告.在1.0版的Android Studio中不再是这种情况.

请查看http://www.doubleencore.com/2013/05/layout-inflation-as-intended/,以便对此问题进行深入讨论,特别是最后的"每个规则都有例外"部分.


小智 17

在ViewGroup解决警告时抛出null:

View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);
Run Code Online (Sandbox Code Playgroud)

其中liLayoutInflater's对象.

  • 然后我们得到另一个警告"铸造是多余的"! (10认同)
  • 但这是多余的铸造 (8认同)
  • 这个答案是最好的,让您了解为什么您实际上这样做.正如您可能已经读过的那样,简短的故事是,AlertDialog在充气时并不知道它的父级,因此当你真正做正确的事情时,lint会在这种精确的情况下抛出警告的副作用. (3认同)

Jef*_*hen 14

你应该使用AlertDialog.Builder.setView(your_layout_id),所以你不需要给它充气.

AlertDialog.findViewById(your_view_id)创建对话框后使用.

使用(AlertDialog) dialogInterface来获取dialog里面的OnClickListener,然后dialog.findViewById(your_view_id).


Mou*_*usa 7

如果你真的没有parent(例如创建视图AlertDialog),除了传递之外别无选择null.所以这样做是为了避免警告:

final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);
Run Code Online (Sandbox Code Playgroud)

  • 它会产生另一个警告"value'nullParent'始终为null." (4认同)

kjd*_*n84 7

您无需parent为对话框指定.

使用@SuppressLint("InflateParams")覆盖顶部的方法来抑制它.