我正在使用Android Jetpack导航组件开发一个活动应用程序。在其中一个片段上,我利用了内置的数据绑定工具。奇怪的是,尽管它在一周前才工作,但今天它似乎无缘无故地完全崩溃了。
设置:我用于绑定的片段具有以下布局文件:
<?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>
元素作为根,并定义了数据和片段布局部分。
片段代码如下:
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 将视图模型注入到片段中。
当我尝试膨胀布局(使用DataBindingUtil
或生成的FragmentExampleBinding
类(时,它会导致以下异常:
java.lang.IllegalStateException: FragmentExampleBin...flater, container, false( 不得在 com.example.fragments.exampleFragment.onCreateView(exampleFragment.kt:38( at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698( 在。。。
堆栈直接进入操作系统领域,所以基本上它不会提供任何有用的信息。我无法弄清楚为什么结果为空。
我尝试过的:
我尝试过用
inflater.inflate(...)
膨胀布局,它 工作得很好,但这样我就无法使用数据绑定了。我尝试从布局描述中删除所有内容 不是绝对必要的,它仍然不起作用。
我尝试恢复到以前的提交(早在第一次 带绑定的工作版本(,即使它以前曾经工作过, 它现在不起作用。
我什至重新启动并重置了模拟器,尝试了不同的图像,但是 无济于事。
有没有人遇到过类似的事情?代码在周末真的"坏了",因为我刚刚在前一个星期五测试了它并且它工作正常。
编辑:
好的,所以我以某种方式设法修复了它。
我开始尝试创建另一个具有数据绑定的片段,以查看是所有片段还是仅针对该特定片段进行破坏。新的似乎工作得很好,但奇怪的是,旧的破碎的碎片仍然拒绝工作,即使它们基本相同。
所以我做了清理+重建(我发誓我是第一次尝试解决问题(,它只是修复了它。
在我的多模块项目中,这个问题的原因是存在某种包名称冲突。
如果您在没有明显原因的情况下收到此错误,请仔细检查启用了数据绑定的模块的AndroidManifest.xml
文件。
确保所有启用数据绑定的模块都使用唯一的包名称为我解决了这个问题。
我花了几个小时来找到这个问题的根源,希望其他人阅读这个答案,不会花那么多钱。
不要将 DataBindingUtil 用于片段,运行一次您的应用程序,Android Studio 将根据 xml 文件的名称为该片段生成一个绑定类,在您的情况下,xml 文件被调用fragment_example,因此生成的类将是 FragmentExampleBinding,然后您像这样调用 FragmentExampleBinding.inflate(....(
val binding = FragmentExampleBinding.inflate(inflater, container, false);
这样做:
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
}
}
请我需要你在这里粘贴你的错误
就我而言,我只是忘记将@AndroidEntryPoint
添加到我的片段类中