我有一个名为 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)
)
}
}
最好让 Fragment 具有空的构造函数,并将参数作为参数传递到 bundle 中。 由于您有一个列表,因此将它传递到捆绑包中并不是一件好事,因此您应该使用一个保留该列表的 VM,也许还有
moneyType
参数。