为什么在交易到第二个片段横向模式后再次显示我的第一个交易?



我有2个片段。我的第一个片段有一个按钮,它会引导我到第二个片段。它的代码是:

binding.btnGet5Days.setOnClickListener {
val forecastFragment = ForecastFrag()
val transaction: FragmentTransaction =
parentFragmentManager.beginTransaction()
transaction.replace(R.id.fragment_container, forecastFragment)
transaction.addToBackStack(null)
transaction.commit()
}

在我的MainActivity我有这个代码:

val cityFragment = CityFrag()
val fm: FragmentManager = supportFragmentManager
fm.beginTransaction()
.add(R.id.fragment_container, cityFragment)
.commit()

fragment在FragmentContainer中,

问题是当我通过这个按钮加入第二个片段并把我的手机变成横向模式时,我的第一个片段分层到我的第二个片段。我怎么解决它?:)

这是很难知道没有看到你的完整的代码,但有可能你从MainActivity发布的代码是add在现有堆栈顶部的片段。当您旋转设备时,Activity被破坏并重新创建,但FragmentManager保持其状态,因此您不会失去一切。如果你重新创建的活动代码总是添加一个新的片段实例,你最终会与已经存在的东西,加上另一个CityFrag在顶部

官方建议使用Jetpack导航库,它将为您处理所有这些。如果你现在不想走那么远,你必须做你自己的检查和创建逻辑。

你可以做的一件事是检查如果savedInstanceStateBundle传递到你的活动的onCreatenull-如果是,那么这是一个新的开始,你可以初始化你的第一个片段。如果是而不是如果为null,那么你的应用程序正在从某些保存状态重新创建,所以你应该让FragmentManager负责恢复自己和它的后堆栈。

否则,看看FragmentManager-有一堆有用的方法,如getBackStackEntryCount,findFragmentByTag等,你可以用它来找出你的片段在什么状态,如果你需要添加一个或不。这取决于你的代码!

最新更新