当前位置: 首页 > 知识库问答 >
问题:

为什么在膨胀自定义吐司消息时附加到根视图组?

商昆琦
2023-03-14
inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast,
            (ViewGroup) findViewById(R.id.custom_toast_container));

我不明白将布局附加到根视图组的目的,它是布局的一部分。为什么不使用attachToRoot标志为false:

View layout = inflater.inflate(R.layout.custom_toast, 
(ViewGroup) findViewById(R.id.custom_toast_container), false);

顺便说一句,我的自定义toast消息可以正常工作,即使我省略了根视图并使用'null'作为第二个参数调用culflate。我明白这可能会在评估LayoutParams时引起一些问题,但我看不到任何问题。

共有1个答案

令狐泓
2023-03-14

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

>

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

    我们在这样的场景中使用它:如果您在一个单独的XML文件中有一个按钮,您希望附加到布局(它可能是您的主按钮)。

    inflater.inflate(R.layout.my_custom_button, myLinearLayout, true);
    

    传递false:这意味着,您要求invalate()方法不要将第一个视图附加到第二个视图,但是在本例中,您必须在之后自己添加它。

    示例:

    Button button = (Button) inflater.inflate(R.layout.my_custom_button, myLinearLayout, false);
    myLinearLayout.addView(button);
    

    它与第一个场景相同,因此这里没有必要传递false。但是,在某些情况下,当您不是负责将布局文件的视图附加到其根视图组的人时,应该将第三个参数作为false传递。

    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);
    }
    

    有关更多详细信息,请参阅源代码

    在阅读了下面的评论之后,我现在看到了您对这件事的困惑:您似乎知道上面的规则,但您唯一的困惑是:为什么我们要将视图作为root传递给inflate()中的第二个参数,尽管它已经是我们在第一个参数中传递的XML资源中的root。

    简单地说,这就是inflate()方法的工作原理:理解为什么我们需要inflate()中的第二个参数,就可以解决这个问题:

    除了上面所写的内容之外:inflate()中的第二个参数是root,它是一个可选视图,可以是生成的层次结构的父级(如果第三个参数是true),或者是一个为返回的层次结构的root提供layoutparams值的对象

    因此,inflate()方法将始终在第一个参数处生成所提供的XML文件中视图的层次结构后引用第二个参数。

    在您的特定场景中,我们不会传递false,因为这将导致充气调用忽略XML中的布局参数。

  •  类似资料:
    • 我有一个片段,我在其中膨胀“Fragment\u board.xml”: 如您所见,fragment\u board包含一个自定义视图“BoardView”,我想从中加载以下“view\u board.xml”: 我的自定义视图包含两个滚动视图(我使用它进行平移),我希望能够在其他布局中重复使用它。BoardView扩展了外部(垂直)滚动视图,如下所示: 当我独立使用它时,它会膨胀得很好,我可以在

    • 那么如何对此?要扩展什么才能只调用setContentView()或setLayoutResource()? 我看了很多这样的答案,但没有一个符合我的问题。

    • 我试图在我的应用程序上实现谷歌登录。 工作正常,但当我尝试登录时,我的logcat上出现以下错误: 2018-10-04 14:55:14.784 16313-16313/? I/AppCompatDelegate:无法实例化自定义视图充气器android。支持v7。应用程序。这是充气机。回到违约状态。JAVAlang.ClassNotFoundException:android。支持v7。应用程

    • 还有人觉得这有点令人沮丧或有什么建议吗?从基类中膨胀相同的布局似乎并不罕见。

    • 当获得Release apk时,我会在应用程序的所有活动中获得此错误日志 null 谢谢你。

    • 问题内容: 我每次构建Web应用程序时都会想到的问题之一是,消息应该如何显示给最终用户 我尝试了类似Windows应用程序中的消息框,但是它们看起来很糟糕,并且在服务器上发布时会出现问题。我尝试了一个更新面板,该更新面板的页面底部顶部包含一个很酷的标签。.但是我仍然觉得它根本不够好。有时在使用AJAX时在特定情况下会遇到问题,但对于用户来说仍然不太好… 我想问一下出现一段时间然后消失的消息,例如,