pap*_*e96 5 android android-layout android-fragments android-databinding android-viewmodel
我正在使用 Android Jetpack 导航组件开发单个活动应用程序。在其中一个片段上,我使用了内置的数据绑定工具。奇怪的是,尽管它在前一周还可以工作,但今天却无缘无故地彻底坏了。
\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>\nRun Code Online (Sandbox Code Playgroud)\n\n我已经删除了主要内容,但它显示我有一个<layout>元素作为根,同时定义了数据和片段布局部分。
片段代码如下:
\n\nclass 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}\nRun Code Online (Sandbox Code Playgroud)\n\n我使用 Koin 将视图模型注入到片段中。
\n当我尝试膨胀布局(使用DataBindingUtil生成的FragmentExampleBinding类)时,会导致以下异常:
\n\n\njava.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我尝试过用它来膨胀布局inflater.inflate(...),它工作得很好,但这样我就无法使用数据绑定。
我已尝试从布局描述中删除并非绝对必要的所有内容,但它仍然不起作用。
我尝试恢复到以前的提交(早到第一个带有绑定的工作版本),尽管它以前可以工作,但现在不起作用。
我什至重新启动并重置模拟器,尝试了不同的图像,但无济于事。
有没有人遇到过类似的事情?该代码在周末确实“崩溃”了,因为我刚刚在周五之前对其进行了测试,并且它工作正常。
\n\n编辑:
\n好吧,所以我设法修复它。
\n我开始尝试使用数据绑定创建另一个片段,以查看是否所有片段都损坏了,或者只是特定的片段损坏了。新的似乎工作得很好,但奇怪的是,旧的、破碎的碎片仍然无法工作,尽管它们基本上是一样的。
\n所以我做了清理+重建(我发誓我是第一次尝试解决这个问题),它就解决了它。
在我的多模块项目中,出现此问题的原因是存在某种包名称冲突。
如果您在没有明显原因的情况下收到此错误,请仔细检查AndroidManifest.xml启用数据绑定的模块的文件。
确保所有启用数据绑定的模块都使用唯一的包名称解决了我的问题。
我花了几个小时来找到这个问题的根源,希望其他人阅读这个答案并且不会花那么多钱。
这样做:
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)
请我需要你将你的错误粘贴到这里
| 归档时间: |
|
| 查看次数: |
6023 次 |
| 最近记录: |