根据此guide,在膨胀自定义Toast消息时,应使用根ViewGroup,这是定义自定义Toast消息的xml文件中的布局。膨胀的视图将附加到此根目录:
inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast,
(ViewGroup) findViewById(R.id.custom_toast_container));
我不明白将布局附加到根ViewGroup的目的,它是布局的一部分。为什么不将attachToRoot标志用作false:
View layout = inflater.inflate(R.layout.custom_toast,
(ViewGroup) findViewById(R.id.custom_toast_container), false);
顺便说一句,即使我省略了根视图并使用'null'作为第二个参数调用inflate,我的自定义Toast消息也能正常工作。我知道它可能会导致评估LayoutParams的一些问题,但我看不到任何问题。
答案 0 :(得分:1)
使用方法inflate()
时,第三个参数具有三个选项:
传递true
:这意味着,您要 附加 inflate()
方法中的第一个参数(视图)以第二个参数(即ViewGroup)。
我们在以下情况下使用它:如果您要附加到Button
的一个单独的XML文件中有一个Layout
(它可能是您的主要文件)。
示例:
inflater.inflate(R.layout.my_custom_button, myLinearLayout, true);
传递false
:这意味着您要使用inflate()
方法 NOT 将第一个视图附加到第二个视图,但是在这种情况下,您必须自己添加。
示例:
Button button = (Button) inflater.inflate(R.layout.my_custom_button, myLinearLayout, false);
myLinearLayout.addView(button);
它的作用与第一种情况相同,因此这里没有传递false
的意义。但是,在某些情况下,您 应该 将第三个参数传递为false
,这样当您不是负责将布局文件的视图附加到其根目录的人时ViewGroup。
示例:
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(getActivity());
View view = inflater.inflate(android.R.layout.list_item_recyclerView, parent, false);
return new ViewHolder(view);
}
通过null
:完全不建议这样做,但是,在这种情况下,您的应用不会崩溃,但是可能行为不当。您的应用将尝试使用LayoutParams
为 根ViewGroup
确定正确的generateDefaultLayoutParams
。
(可能不是您想要的)。
For more details, refer to the source
在阅读下面的评论后,我现在看到您对此事感到困惑:
您似乎已经意识到上述规则,但是唯一的困惑是:为什么我们将View
作为 root 传递给inflate()
中的 second 参数尽管它是我们在 first 参数中传递的XML资源中的 根。
好吧,这很简单,因为inflate()
方法是这样工作的:
了解为什么,我们通常需要inflate()
中的 second 参数将为您解决此问题:
除了上面我写的内容:inflate()
中的 second 参数是根,它是可选视图的父级< / strong>(如果第三个参数为true
),则 OR 会成为 OBJECT 提供 的 ROOT 的LayoutParams
值 层次结构。
因此,inflate()
方法将在提供的XML文件中生成视图的层次结构后,总是 引用 second 参数。在第一个参数上。
在您的特定情况下,我们 不 通过false
,因为这将导致膨胀呼叫 IGNORING < / strong> XML 中的布局参数。