android - DataBindingUtil 将布局膨胀为空

标签 android android-layout android-fragments android-databinding android-viewmodel

我正在使用 Android Jetpack 导航组件开发单个 Activity 应用程序。在其中一个 fragment 上,我使用了内置的数据绑定(bind)工具。奇怪的是,即使它在前一周还可以工作,但它今天似乎无缘无故地完全坏了。

设置:
我用于绑定(bind)的 fragment 具有以下布局文件:

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

    <data>
    </data>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/example_layout_root"
        tools:context=".example.ExampleFragment"
        android:background="@color/main_1"
        >

        ...

    </ScrollView>
</layout>

我已经剥离了主要内容,但它表明我有一个 <layout>元素作为根,定义了数据和 fragment 布局部分。

fragment 代码如下:
class ExamleFragment : Fragment() {

    private val viewModel: ExampleViewModel by sharedViewModel()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        val binding : FragmentExampleBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_example, container, false)
        // This one also does not work
        // val binding = FragmentExampleBinding.inflate(inflater, container, false)
        binding.vm = viewModel
        binding.lifecycleOwner = this

        return binding.root
    }
}

我使用 Koin 将 View 模型注入(inject)到 fragment 中。
当我尝试扩展布局(使用 DataBindingUtil 或生成的 FragmentExampleBinding 类)时,会导致以下异常:

java.lang.IllegalStateException: FragmentExampleBin…flater, container, false) must not be null at com.example.fragments.ExampleFragment.onCreateView(ExampleFragment.kt:38) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698) at ...



而且堆栈直接进入操作系统领域,所以基本上它没有提供任何有用的信息。我无法弄清楚为什么结果为空。

我试过的:
  • 我尝试使用 inflater.inflate(...) 来扩展布局它
    工作得很好,但这样我就不能使用数据绑定(bind)。
  • 我已经尝试从布局描述中删除所有内容
    不是绝对必要的,它仍然不起作用。
  • 我已经尝试恢复到以前的提交(早在第一个
    带绑定(bind)的工作版本),即使它以前可以工作,
    它现在不起作用。
  • 我什至重新启动并重置了模拟器,尝试了不同的图像,但是
    无济于事。

  • 有没有人遇到过类似的事情?代码在周末真的“崩溃”了,因为我在前周五刚刚测试过它并且它工作正常。

    编辑 :
    好的,所以我设法解决了它。
    我开始尝试使用数据绑定(bind)创建另一个 fragment ,以查看是否所有 fragment 都损坏了,或者只是那个特定的 fragment 。新的似乎可以正常工作,但奇怪的是,即使它们基本相同,旧的 splinter fragment 仍然无法工作。
    所以我做了 Clean + Rebuild(我发誓这是我第一次尝试解决这个问题),它只是修复了它。

    最佳答案

    在我的多模块项目,这个问题的原因是存在某种包名冲突的事实。
    如果您在没有明显原因的情况下收到此错误,请仔细检查 AndroidManifest.xml启用数据绑定(bind)的模块的文件。
    确保所有启用数据绑定(bind)的模块都使用 唯一的包名 为我解决了这个问题。
    我花了几个小时来找到这个问题的根源,希望其他人阅读这个答案并且不会花那么多钱。

    关于android - DataBindingUtil 将布局膨胀为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59826066/

    相关文章:

    android - 在布局绑定(bind)中使用属性资源 (?attr/)?

    android - 如何禁用某些 fragment 的底部导航

    android - 使用布局 XML 创建按钮

    android - 如何在 react 导航中获取当前路线名称?

    android - 我的自定义警报对话框比需要的要高得多

    Android获取当前 fragment 的ID

    java - Mockito 验证仅在 AVD 运行时通过

    java - 为什么RecyclerView没有显示任何项目?

    android - get SharedPreferences 在某些设备上返回空指针异常

    android - 如何从特定的 Activity 中选择打开哪个 fragment ?