在使用Avoid passing null as the view root
将null
视图展开为parent
时,我会收到lint警告LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);
,例如:
AlertDialog
但是,该视图将在setView
上使用AlertDialog.Builder
用作parent
的内容,因此我不知道应该将哪些内容传递给parent
{1}}。
在这种情况下,您认为{{1}}应该是什么?
答案 0 :(得分:149)
使用此代码在没有警告的情况下膨胀对话框视图:
View.inflate(context, R.layout.dialog_edit, null);
答案 1 :(得分:29)
简短的故事是,当您为对话框充气时,parent
应该为空,因为在查看通货膨胀时间不知道。在这种情况下,您有三种基本解决方案可以避免警告:
inflate(int resource, ViewGroup root, boolean attachToRoot)
为视图充气。将attachToRoot
设置为false
。这告诉inflater父级不可用。查看http://www.doubleencore.com/2013/05/layout-inflation-as-intended/以查看有关此问题的详尽讨论,特别是"每个规则都有例外情况"最后一节。
答案 2 :(得分:16)
在ViewGroup解决警告时<\ n>
View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);
其中li
是LayoutInflater'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)
据我所知,AlertDialog是唯一可以安全使用 null 而不是父视图的情况。在这种情况下,您可以使用以下方法禁止显示警告:
@SuppressLint(“ InflateParams”)
通常,您永远不要使用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)