BottomSheetDialog 布局上的数据绑定(崩溃)

Data-binding on BottomSheetDialog Layout (Crash)

我无法让数据绑定在 BottomSheetDialog 布局上正常工作。详情如下:

变量的定义和设置:

private lateinit var myDrawerBinding: MyDrawerBinding

myDrawerBinding = MyDrawerBinding.bind(myDrawerContent) // crashes on this line

后来就是这样设置和显示的(虽然从来没有到过这一步)

myDrawerBinding.viewModel = theViewModel

val bottomSheet = BottomSheetDialog(context)
bottomSheet.setContentView(myDrawerBinding.myDrawerContent)
bottomSheet.show()

这是 XML 布局 (my_drawer.xml) 的片段:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

<data>
    <import type="android.view.View"/>
    <variable name="viewModel" type="path.to.my.viewModel"/>
</data>

<RelativeLayout
        android:id="@+id/myDrawerContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp">

    <View
            android:layout_width="50dp"
            android:layout_height="3dp"
            android:visibility="@{viewModel.shouldShowView() ? View.VISIBLE : View.GONE}"/>
....

调用上面的.bind()方法时崩溃,错误为:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.view.View.getTag()' on a null object reference

我在同一个 Fragment 中显示的单独的 DrawerLayout 也有同样的功能,但出于某种原因,BottomSheetDialog 布局出现了问题。

终于找到了解决办法。我必须以与我的 DrawerLayout 稍有不同的方式处理此视图,尽管我感觉这种方法也适用于该视图。

这是绑定设置:

val myDrawerView = layoutInflater.inflate(R.layout.my_drawer, null)
val binding = MyDrawerBinding.inflate(layoutInflater, myDrawerView as ViewGroup, false)
binding.viewModel = theViewModel

然后显示视图:

val bottomSheetDialog = BottomSheetDialog(context)
bottomSheetDialog.setContentView(binding.myDrawerContent)
bottomSheetDialog.show()

现在很有魅力!