当AlertDialog使用视图时,请避免“传递null作为视图根目录”警告

我得到了lint警告,当用null作为parent充气视图时Avoid passing null as the view root ,如下所示:

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

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

你觉得在这种情况下, parent应该是什么?

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

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

简而言之,当你膨胀一个对话视图的时候, parent应该是空的,因为在查看通货膨胀时间它是不知道的。 在这种情况下,您有三个基本的解决scheme来避免警告:

  1. 使用@Suppress抑制警告
  2. 使用视图的膨胀方法膨胀视图。 这只是一个LayoutInflater的包装,大部分只是混淆了这个问题。
  3. 使用LayoutInflater的完整方法 inflate(int resource, ViewGroup root, boolean attachToRoot)视图:inflate inflate(int resource, ViewGroup root, boolean attachToRoot) attachToRoot设置为false 。这告诉attachToRoot该父项不可用。 在较旧版本的Android Lint中,这样删除了警告。 1.0版本的Android Studio不再是这种情况。

请查看http://www.doubleencore.com/2013/05/layout-inflation-as-intended/以获得关于此问题的详细讨论,特别是最后的“每条规则有例外”部分。;

作为ViewGroup投射null解决了警告:

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

其中liLayoutInflater's对象。

你应该使用AlertDialog.Builder.setView(your_layout_id) ,所以你不需要夸大它。

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

使用(AlertDialog) dialogInterface获取(AlertDialog) dialogInterface中的dialog ,然后dialog.findViewById(your_view_id)

当你真的没有任何parent (例如为AlertDialog创build视图)时,除了传递null之外没有别的select。 所以这样做是为了避免警告:

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

您不需要为对话框指定parent

在覆盖顶部使用@SuppressLint("InflateParams")来抑制这一点。

而不是做

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

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

它会用给定的父母夸大它,但不会将其附加到父母。

非常感谢Coeffect( 链接到他的文章 )