android-fragments DataBindingUtil将布局扩大为空

muk1a3rh  于 2022-11-14  发布在  Android
关注(0)|答案(4)|浏览(121)

我正在使用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(...)膨胀布局,它工作得很好,但是这样我就不能使用数据绑定了。
  • 我已经尝试从布局描述中删除所有不是绝对必要的内容,但它仍然不起作用。
  • 我尝试过恢复到以前的提交(最早可以追溯到第一个带绑定的工作版本),尽管以前它可以工作,但现在它不工作了。
  • 我甚至重新启动和重置模拟器,尝试了不同的图像,但无济于事。

有没有人遇到过类似的情况?代码真的在周末“坏了”,因为我刚刚在前一个星期五测试过它,它工作正常。

编辑

好吧,我想办法修好了。
我开始尝试创建另一个带有数据绑定的片段,看看是所有片段都坏了,还是只有那个特定的片段坏了。新的片段似乎工作得很好,但奇怪的是,旧的、坏了的片段仍然拒绝工作,尽管它们基本上是一样的。
所以我做了清理+重建(我发誓我是第一次尝试修复这个问题),它只是修复了它。

33qvvth1

33qvvth11#

在我的多模块项目中,这个问题的原因是存在某种包名冲突。
如果在没有明显原因的情况下出现此错误,请仔细检查启用了数据绑定的模块的AndroidManifest.xml文件。
确保所有启用数据绑定的模块都使用唯一的包名,我就解决了这个问题。
我花了几个小时来寻找这个问题的根源,希望其他人读了这个答案,不会花那么多钱。

quhf5bfb

quhf5bfb2#

不要对片段使用DataBindingUtil,运行一次应用,Android Studio将根据xml文件的名称为该片段生成一个绑定类,在您的情况下,xml文件名为fragment_example,因此生成的类将为FragmentExampleBinding,然后您调用FragmentExampleBinding.inflate(....),如下所示:

val binding = FragmentExampleBinding.inflate(inflater, container, false);
eanckbw9

eanckbw93#

这样做:

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
        }
    }

我需要你把你的错误粘贴在这里

zf2sa74q

zf2sa74q4#

在我的例子中,我只是忘记将@AndroidEntryPoint添加到我的fragment类中

相关问题