我正在使用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将viewmodel注入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 ...
堆栈直接进入操作系统领域,因此基本上没有提供任何有用信息。我无法弄清楚为什么结果是null。
我尝试过的解决方法:
我尝试使用
inflater.inflate(...)
来填充布局,它可以正常工作,但这样我就不能使用数据绑定。我尝试从布局描述中删除所有不必要的内容,但仍然无法正常工作。
我尝试还原到以前的提交版本(最早的具有绑定功能的工作版本),即使以前可以正常工作,现在也不能正常工作。
我甚至重新启动和重置模拟器,尝试不同的镜像,但都无济于事。
有人遇到过类似的情况吗?代码在周末确实“崩溃”了,因为我在上周五测试它时它可以正常工作。
编辑:
好吧,我不知何故修复了它。
我开始尝试创建另一个使用数据绑定的fragment,以查看所有片段是否都存在问题,新的片段似乎可以正常工作,但奇怪的是,旧的不起作用即使它们基本相同。
因此,我进行了清理+重新构建(我发誓我会将其作为第一次修复问题),这种方法竟然有效了。