如何替换顶部片段?

时间:2019-01-15 22:53:43

标签: android android-fragments kotlin

我有一个包含4个片段的应用程序:MainFragment,ActionFragment,DoneFragment,FailedFragment。应用程序启动时显示MainFragment。应用程序将收到一些事件,并使用两个按钮“是”和“否”显示ActionFragment。如果用户按“是”,则应用程序显示DoneFragment,否则显示FailedFragment。当用户在ActionFragment上按一次后退按钮时,DoneFragment或FailedFragment应用程序必须显示MainFragment。

重要提示:如果已经打开了ActionFragment,DoneFragment或FailedFragment,并且再次发生了某些事件,则应用程序应显示带有新事件数据的ActionFragment片段。

所以,我需要:

  • 如果已经打开了ActionFragment,DoneFragment或FailedFragment并发生了事件,我应该用ActionFragment替换顶部片段
  • 否则,我应该简单地添加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?

2 个答案:

答案 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可能是在片段之间导航的更简单方法。