DataBindingUtil 将布局膨胀为 null

pap*_*e96 5 android android-layout android-fragments android-databinding android-viewmodel

我正在使用 Android Jetpack 导航组件开发单个活动应用程序。在其中一个片段上,我使用了内置的数据绑定工具。奇怪的是,尽管它在前一周还可以工作,但今天却无缘无故地彻底坏了。

\n\n

设置:
\n我与绑定一起使用的片段具有以下布局文件:

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<layout \n    xmlns:android="http://schemas.android.com/apk/res/android"\n    xmlns:app="http://schemas.android.com/apk/res-auto"\n    xmlns:tools="http://schemas.android.com/tools">\n\n    <data>\n    </data>\n\n    <ScrollView\n        android:layout_width="match_parent"\n        android:layout_height="match_parent"\n        android:id="@+id/example_layout_root"\n        tools:context=".example.ExampleFragment"\n        android:background="@color/main_1"\n        >\n\n        ...\n\n    </ScrollView>\n</layout>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经删除了主要内容,但它显示我有一个<layout>元素作为根,同时定义了数据和片段布局部分。

\n\n

片段代码如下:

\n\n
class ExamleFragment : Fragment() {\n\n    private val viewModel: ExampleViewModel by sharedViewModel()\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        // Inflate the layout for this fragment\n        val binding : FragmentExampleBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_example, container, false)\n        // This one also does not work\n        // val binding = FragmentExampleBinding.inflate(inflater, container, false)\n        binding.vm = viewModel\n        binding.lifecycleOwner = this\n\n        return binding.root\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我使用 Koin 将视图模型注入到片段中。
\n当我尝试膨胀布局(使用DataBindingUtil生成的FragmentExampleBinding类)时,会导致以下异常:

\n\n
\n

java.lang.IllegalStateException : FragmentExampleBin\xe2\x80\xa6flater、容器、false) 在 androidx.fragment.app 的 \n com.example.fragments.ExampleFragment.onCreateView(ExampleFragment.kt:38)\n 处不得为 null。 Fragment.performCreateView(Fragment.java:2698)\n 位于 ...

\n
\n\n

而且堆栈直接进入操作系统领域,因此基本上它不会提供任何有用的信息。我不明白为什么结果为空。

\n\n

我尝试过的:

\n\n
    \n
  • 我尝试过用它来膨胀布局inflater.inflate(...),它工作得很好,但这样我就无法使用数据绑定。

  • \n
  • 我已尝试从布局描述中删除并非绝对必要的所有内容,但它仍然不起作用。

  • \n
  • 我尝试恢复到以前的提交(早到第一个带有绑定的工作版本),尽管它以前可以工作,但现在不起作用。

  • \n
  • 我什至重新启动并重置模拟器,尝试了不同的图像,但无济于事。

  • \n
\n\n

有没有人遇到过类似的事情?该代码在周末确实“崩溃”了,因为我刚刚在周五之前对其进行了测试,并且它工作正常。

\n\n

编辑
\n好吧,所以我设法修复它。
\n我开始尝试使用数据绑定创建另一个片段,以查看是否所有片段都损坏了,或者只是特定的片段损坏了。新的似乎工作得很好,但奇怪的是,旧的、破碎的碎片仍然无法工作,尽管它们基本上是一样的。
\n所以我做了清理+重建(我发誓我是第一次尝试解决这个问题),它就解决了它。

\n

Saf*_*han 7

在我的多模块项目中,出现此问题的原因是存在某种包名称冲突。

如果您在没有明显原因的情况下收到此错误,请仔细检查AndroidManifest.xml启用数据绑定的模块的文件。

确保所有启用数据绑定的模块都使用唯一的包名称解决了我的问题。

我花了几个小时来找到这个问题的根源,希望其他人阅读这个答案并且不会花那么多钱。

  • 现在,也看看 build.gradle `android { namespace }` 也导致了同样的问题。 (2认同)

fre*_*uks 0

这样做:

class ExamleFragment : Fragment() {

        private val viewModel: ExampleViewModel by sharedViewModel()
        lateinit binding:FragmentExmaple

        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            // Inflate the layout for this fragment
             binding = DataBindingUtil.inflate(inflater, R.layout.fragment_example, container, false)

            binding.vm = viewModel
            binding.lifecycleOwner = this

            return binding.root
        }
    }
Run Code Online (Sandbox Code Playgroud)

请我需要你将你的错误粘贴到这里