视图绑定适用于一种布局,但不适用于另一种布局

时间:2021-01-06 17:10:18

标签: android kotlin android-viewbinding

Android 开发新手,我正在尝试应用视图绑定,因为它们是谷歌目前推荐的视图引用方法。我有两个布局 content_main.xml 和 content_note_list.xml。我得到了第一个“content_main_xml”(MainActivity)来处理视图绑定。但是,我无法为第二个“content_note_list.xml”实现视图绑定。

以下是在模拟器中不断使应用程序崩溃的代码 here's the image of the code block

当我不使用视图绑定时它有效。

setContentView(R.layout.activity_note_list)

但是一旦我尝试使用视图绑定,它就会打开应用程序并暂时崩溃

setContentView(binding.root)

我不知道我做错了什么,我已经按照官方 android 开发站点提供的描述,多个视频。 任何帮助都是必要的。

编辑: content_note_list.xml activity_note_list.xml

抱歉附加图片文件,当我尝试附加时代码变得一团糟。

2 个答案:

答案 0 :(得分:1)

好像是这个名字。从android documentation记住。如果您的布局是 result_profile.xml

<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>

ViewBinding 将生成 ResultProfileBinding

<块引用>

如果为模块启用了视图绑定,则会为模块包含的每个 XML 布局文件生成一个绑定类。每个绑定类都包含对根视图和所有具有 ID 的视图的引用。绑定类的名称是通过将XML文件的名称转换为Pascal大小写并在末尾添加“Binding”一词来生成的。

所以,考虑到这一点。如果您的布局是 activity_note_list,它将生成 ActivityNoteListBinding 类或类似的东西。在您的代码中,您正在设置 ContentNoteListBinding 类。尝试用 ContentNoteListBinding 替换 ActivityNoteListBinding。另外,如果没有解决问题。尝试从控制台日志添加代码。它有关于错误的更多详细信息。

更新

如果您想通过 <include> 标记处理包含在您的活动/片段中的 View 或 ViewGroup,您几乎可以直接访问这些视图。您需要在此标记 <include> 中添加一个 ID。然后您将可以访问这些组件:例如:

这是一个activity_note_list.xml

........
<include 
    id="+@id/ly_content_list_note"
    layout="@layout/content_list_note"/>
........

还有 content_note_list.xml

<listView
    id="+id/listNotes"
    .......
/>

现在在您的 Activity 类中,您可以通过以下方式访问:

binding.lyContentListNote.listNotes

如您所见,首先直接访问容器的 id,即 ly_content_list_note,然后访问其中的所有视图组件,在本例中为 listNotes

答案 1 :(得分:1)

添加到@rguzman 的答案中,为了避免遇到此类绑定类型意外设置错误的问题,您可以使用 DataBindingUtil 库。

对于活动

val binding = DataBindingUtil.setContentView(this, R.layout.your_file)

对于片段

 binding = DataBindingUtil.inflate(inflater, R.layout.your_file, container, false)

//other logic

return binding.root

link 到官方文档了解更多信息