无法用构造函数打开片段。 “找不到片段构造函数。”

问题描述 投票:0回答:1

我有一个名为 MoneyListFragment 的片段。它位于 HomeFragment 的 viewpager 中。 MainAactivity 在 xml 中有片段对象。 HomeFragment 在里面。它打开 MoneyListFragment 以选项卡布局作为视图 Pager 片段,因此从中传递构造函数。

现在,我想从 MainAcitivty 打开 MoneyListFragment。但我无法实现这一目标。我从 nav_graph_main.xml 添加了 MoneyListFragment。当我像那样尝试时,发生了这个错误。

找不到片段构造器

如何才能成功?

nav_graph_main.xml

<fragment
    android:id="@+id/moneyListFragment"
    android:name="com.magazam.ui.earning.money.MoneyListFragment"
    android:label="MoneyListFragment">
    <argument
        android:name="detailList"
        app:argType="com.magazam.adapters.MoneyItem[]" />
    <argument
        android:name="moneyType"
        app:argType="com.magazam.adapters.MoneyType" />
</fragment>



class MoneyListFragment(
    private val detailList: List<MoneyItem>?,
    private val moneyType: MoneyType
) : BaseFragment<FragmentMoneyListBinding>() {

    override val bindingInflater: (LayoutInflater) -> ViewBinding
        get() = FragmentMoneyListBinding::inflate

    override fun onCreateFinished() {
        val detailListFromMain = arguments?.getParcelableArrayList<MoneyItem>("detailList")?.toList()
    var moneyTypeFromMain = MoneyType.EARNING
    if(arguments?.getString("moneyType") == MoneyType.EARNING.toString()) moneyTypeFromMain = MoneyType.EARNING
    else if (arguments?.getString("moneyType") == MoneyType.SPENDING.toString()) moneyTypeFromMain = MoneyType.SPENDING

    if (arguments != null){
        if (detailListFromMain.isNullOrEmpty()) {
            binding.groupNoDetail.visible()
        } else {
            binding.rvMoneyDetail.visible()
            binding.rvMoneyDetail.adapter = MoneyDetailAdapter(detailListFromMain, moneyTypeFromMain)
        }
    } else {
        if (detailList.isNullOrEmpty()) {
            binding.groupNoDetail.visible()
        } else {
            binding.rvMoneyDetail.visible()
            binding.rvMoneyDetail.adapter = MoneyDetailAdapter(detailList, moneyType)
        }
    }
}
}

MainActivity.kt

        if (earningList == null){
            val emptyList = listOf(MoneyItem("null", "null", "null"))
            Navigation.findNavController(this, R.id.nav_host_fragment).navigate(
                HomeFragmentDirections.actionHomeToMoneyListFragment(emptyList.toTypedArray(), MoneyType.SPENDING)
            )
        } else {
            earningList?.let { it1 ->
                Navigation.findNavController(this, R.id.nav_host_fragment).navigate(
                    HomeFragmentDirections.actionHomeToMoneyListFragment(it1.toTypedArray(), MoneyType.SPENDING)
                )
            }
        }
android kotlin android-fragments uinavigationcontroller
1个回答
0
投票

最好让 Fragment 具有空的构造函数,并将参数作为参数传递到 bundle 中。 由于您有一个列表,因此将它传递到捆绑包中并不是一件好事,因此您应该使用一个保留该列表的 VM,也许还有

moneyType
参数。

© www.soinside.com 2019 - 2024. All rights reserved.