java - 为什么在扩充自定义 Toast 消息时附加到根 ViewGroup?

标签 java android android-layout

根据这个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() 方法时,第三个参数有三个选项:

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

    我们在这样的场景中使用它,如果你有一个 Button在一个单独的 XML 文件中,您要附加到 Layout (它可能是您的主要对象)。

    示例:

    inflater.inflate(R.layout.my_custom_button, myLinearLayout, true);
    
  2. 传递 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);
    }
    
  3. 传递 null : 完全不推荐,但是,您的应用在这种情况下不会崩溃,但它可能会出现异常。您的应用程序将尝试确定正确的 LayoutParams对于 root ViewGroup 通过使用 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/

相关文章:

java - 如何使 Activity 在每次进入 Activity 时不重新加载/刷新?

android - 如何使 Android GridLayout 与旧版本兼容?

android - 如何从 XML 扩展扩展的 LinearLayout

java - Spring Boot - application.yml,从文件中读取值

java - 使用正则表达式提取字符串

iOS 内存警告的 Android 版本

Android - 如何将 Spinner 中的选择添加到 EditText

java - Android Proguard - 一步一步

Java:创建名称为 'loadTimeWeaver' 的 bean 时出错?

java - CQRS 和 EventSourcing 的框架建议