根据这个guide ,在扩展自定义 toast 消息时,应使用根 ViewGroup,它是定义自定义 toast 消息的 xml 文件中的布局。膨胀 View 将附加到此根:
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);
顺便说一句,即使我省略了 Root View 并使用“null”作为第二个参数调用 inflate,我的自定义 toast 消息也能正常工作。我知道这可能会导致评估 LayoutParams 时出现一些问题,但我看不到任何问题。
最佳答案
经验法则
当您使用 inflate()
方法时,第三个参数有三个选项:
传递
true
: 这意味着,您要求附加inflate()
中的第一个参数( View )第二个参数(即 ViewGroup)的方法。我们在这样的场景中使用它,如果你有一个
Button
在一个单独的 XML 文件中,您要附加到Layout
(它可能是您的主要对象)。示例:
inflater.inflate(R.layout.my_custom_button, myLinearLayout, true);
传递
false
: 这意味着,你问的是inflate()
方法 NOT 将第一个 View 附加到第二个 View ,但在这种情况下,您必须在之后自己添加它。示例:
Button button = (Button) inflater.inflate(R.layout.my_custom_button, myLinearLayout, false); myLinearLayout.addView(button);
它和第一个场景一样,所以没有必要传递
false
这里。但是,有些情况下您应该将第三个参数作为false
传递这样当您不是负责将布局文件的 View 附加到其根 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
对于 rootViewGroup
通过使用generateDefaultLayoutParams
. (这可能不是您想要的)。
For more details, refer to the source
更新
在阅读了您在下方的评论后,我现在明白了您对此事的困惑所在:
您似乎知道上述规则,但您唯一的困惑是:为什么我们要传递 View
作为 inflate()
中的 second 参数的 root虽然它已经是我们在第一个参数中传递的 XML 资源中的根。
好吧,这很简单,因为这就是 inflate()
方法有效:
理解为什么我们需要 inflate()
中的second 参数一般会为你解决这个问题:
除了我上面写的:inflate()
中的second参数是根,它是一个可选 View ,是生成层次结构的父级(如果第三个参数是 true
),或 成为 OBJECT PROVIDES LayoutParams
RETURNED 层次结构的 ROOT 的值。
所以 inflate()
方法将始终在第一个参数处生成提供的 XML 文件中的 View 层次结构后引用第二个参数。
结论
在您的特定情况下,我们不传递false
因为这会导致调用 IGNORING 来自 XML 的布局参数。
关于java - 为什么在扩充自定义 Toast 消息时附加到根 ViewGroup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50900489/