我有一个包含4个片段的应用程序:MainFragment,ActionFragment,DoneFragment,FailedFragment。应用程序启动时显示MainFragment。应用程序将收到一些事件,并使用两个按钮“是”和“否”显示ActionFragment。如果用户按“是”,则应用程序显示DoneFragment,否则显示FailedFragment。当用户在ActionFragment上按一次后退按钮时,DoneFragment或FailedFragment应用程序必须显示MainFragment。
重要提示:如果已经打开了ActionFragment,DoneFragment或FailedFragment,并且再次发生了某些事件,则应用程序应显示带有新事件数据的ActionFragment片段。
所以,我需要:
我正在尝试:
fun addOrReplaceFragment(fragment: Fragment, tag: String) {
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
val previous = fragmentManager.findFragmentByTag(tag)
if (previous == null) {
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
fragmentTransaction.add(R.id.main_fragment_container, fragment, tag)
fragmentTransaction.addToBackStack(tag)
} else {
fragmentManager.popBackStack(previous.id, 0)
fragmentTransaction.remove(previous)
fragmentTransaction.add(R.id.main_fragment_container, fragment, tag)
fragmentTransaction.addToBackStack(tag)
}
fragmentTransaction.commitAllowingStateLoss()
}
// ...
addOrReplaceFragment(ActionFragment(), "singleTag")
// ...
addOrReplaceFragment(DoneFragment(), "singleTag")
// ...
addOrReplaceFragment(FailedFragment(), "singleTag")
这是popBackStack()不起作用。当ActionFragment打开时,DoneFragment或FailedFragment会在上面添加。而且用户必须按两次以返回MainFragment。
我发现解决方案将popBackStack()更改为popBackStackImmediate()。它运作良好,但如果将活动最小化,则会产生IllegalStateException崩溃,因为无法在onSaveInstanceState()之后调用popBackStackImmediate()。
如何替换顶部片段并避免IllegalStateException?
答案 0 :(得分:0)
尝试一下:
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.FragmentToBeReplaced,theFragmentToBeAdded);
ft.commit();
答案 1 :(得分:0)
https://developer.android.com/reference/android/app/FragmentManager.html#isStateSaved()
使用isStateSaved
避免交易发生时丢失状态。
我认为Android navigation component可能是在片段之间导航的更简单方法。