为什么在膨胀自定义Toast消息时附加到根ViewGroup?

时间:2018-06-17 21:09:23

标签: java android android-layout

根据此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的一些问题,但我看不到任何问题。

1 个答案:

答案 0 :(得分:1)

经验法则

使用方法inflate()时,第三个参数具有三个选项:

  1. 传递true:这意味着,您要 附加 inflate()方法中的第一个参数(视图)以第二个参数(即ViewGroup)。

    我们在以下情况下使用它:如果您要附加到Button的一个单独的XML文件中有一个Layout(它可能是您的主要文件)。

    示例:

    inflater.inflate(R.layout.my_custom_button, myLinearLayout, true);
    
  2. 传递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);
    }
    
  3. 通过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 中的布局参数。