我正在使用Android Jetpack导航组件开发一个Activity应用程序。在其中一个片段上,我使用了内置的数据绑定工具。奇怪的是,尽管它在一周前还能正常工作,但今天却完全坏了,似乎没有任何原因。
设置:
我在绑定中使用的片段具有以下布局文件:
<?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.非法状态异常:如果您的应用程序中有一个文件夹,那么您的文件夹必须是空的,并且不能是空的。
堆栈直接进入了操作系统的领域,所以基本上它没有给予任何有用的信息,我不知道为什么结果是空的。
我尝试过的方法:
- 我试过用
inflater.inflate(...)
膨胀布局,它工作得很好,但是这样我就不能使用数据绑定了。 - 我已经尝试从布局描述中删除所有不是绝对必要的内容,但它仍然不起作用。
- 我尝试过恢复到以前的提交(最早可以追溯到第一个带绑定的工作版本),尽管以前它可以工作,但现在它不工作了。
- 我甚至重新启动和重置模拟器,尝试了不同的图像,但无济于事。
有没有人遇到过类似的情况?代码真的在周末“坏了”,因为我刚刚在前一个星期五测试过它,它工作正常。
编辑:
好吧,我想办法修好了。
我开始尝试创建另一个带有数据绑定的片段,看看是所有片段都坏了,还是只有那个特定的片段坏了。新的片段似乎工作得很好,但奇怪的是,旧的、坏了的片段仍然拒绝工作,尽管它们基本上是一样的。
所以我做了清理+重建(我发誓我是第一次尝试修复这个问题),它只是修复了它。
4条答案
按热度按时间33qvvth11#
在我的多模块项目中,这个问题的原因是存在某种包名冲突。
如果在没有明显原因的情况下出现此错误,请仔细检查启用了数据绑定的模块的
AndroidManifest.xml
文件。确保所有启用数据绑定的模块都使用唯一的包名,我就解决了这个问题。
我花了几个小时来寻找这个问题的根源,希望其他人读了这个答案,不会花那么多钱。
quhf5bfb2#
不要对片段使用DataBindingUtil,运行一次应用,Android Studio将根据xml文件的名称为该片段生成一个绑定类,在您的情况下,xml文件名为fragment_example,因此生成的类将为FragmentExampleBinding,然后您调用FragmentExampleBinding.inflate(....),如下所示:
eanckbw93#
这样做:
我需要你把你的错误粘贴在这里
zf2sa74q4#
在我的例子中,我只是忘记将
@AndroidEntryPoint
添加到我的fragment类中