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

时间:2014-10-16 12:51:29

标签: android alertdialog layout-inflater

在使用Avoid passing null as the view rootnull视图展开为parent时,我会收到lint警告LayoutInflater.from(context).inflate(R.layout.dialog_edit, null); ,例如:

AlertDialog

但是,该视图将在setView上使用AlertDialog.Builder用作parent的内容,因此我不知道应该将哪些内容传递给parent {1}}。

在这种情况下,您认为{{1}}应该是什么?

10 个答案:

答案 0 :(得分:149)

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

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

答案 1 :(得分:29)

简短的故事是,当您为对话框充气时,parent应该为空,因为在查看通货膨胀时间不知道。在这种情况下,您有三种基本解决方案可以避免警告:

  1. 使用@Suppress
  2. 取消警告
  3. 使用查看inflate method为视图充气。这只是LayoutInflater的一个包装器,大多只是模糊了这个问题。
  4. 使用LayoutInflater' full methodinflate(int resource, ViewGroup root, boolean attachToRoot)为视图充气。将attachToRoot设置为false。这告诉inflater父级不可用。在旧版本的Android Lint中,这删除了警告。在1.0版的Android Studio版本中不再是这种情况。
  5. 查看http://www.doubleencore.com/2013/05/layout-inflation-as-intended/以查看有关此问题的详尽讨论,特别是"每个规则都有例外情况"最后一节。

答案 2 :(得分:16)

在ViewGroup解决警告时<\ n>

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

其中liLayoutInflater's对象。

答案 3 :(得分:14)

您应该使用AlertDialog.Builder.setView(your_layout_id),因此您不需要对其进行充气。

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

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

答案 4 :(得分:7)

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

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

答案 5 :(得分:7)

您不需要为对话框指定parent

使用覆盖顶部的@SuppressLint("InflateParams")取消此操作。

答案 6 :(得分:0)

  1. 据我所知,AlertDialog是唯一可以安全使用 null 而不是父视图的情况。在这种情况下,您可以使用以下方法禁止显示警告:

    @SuppressLint(“ InflateParams”)

  2. 通常,您永远不要使用SupressLint或其他答案中提到的解决方法之一来摆脱警告。父视图对于评估在放大视图的根元素中声明的布局参数是必需的。这意味着,如果您使用 null 而不是父视图,则将忽略根元素中的所有布局参数,并将其替换为默认的布局参数。在大多数情况下,它会很好,但是在某些情况下,它会导致真正难以发现的错误。

答案 7 :(得分: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.

答案 8 :(得分: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);

答案 9 :(得分:-1)

而不是做

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

DO

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

它将使用给定的父级对其进行充气,但不会将其附加到父级。

非常感谢Coeffect(link to his post