在popBackStackImmediate和replace之后片段仍然可见

时间:2018-03-09 06:24:56

标签: java android android-fragments android-lifecycle fragment-backstack

我的backstack上有fragmentA,屏幕上有fragmentB。我想用fragmentC替换fragmentB,这样当用户按下时,我们回到fragmentA。这就是我用fragmentC

替换fragmentB的方法
    final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.content_container, fragment);
    transaction.commitAllowingStateLoss();

这是我处理背压的方式

    final FragmentManager fm = getSupportFragmentManager();
    if (fm.getBackStackEntryCount() != 0) {
        fm.popBackStackImmediate();
    } else {
        super.onBackPressed();
    }

用fragmentC替换fragmentB后,当按下后退按钮时会显示fragmentA,但是屏幕上仍然可以看到fragmentC,这给了我一些非常奇怪的UI。任何人都知道为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

将交易添加到Backstack:


    final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.content_container, fragment);
    transaction.addToBackStack("")
    transaction.commitAllowingStateLoss();

答案 1 :(得分:0)

如果我弄错了,FragmentA会叠加在FragmentC上,因此两个片段都可见。

如果是这种情况,请在xml布局中设置片段A和C的背景。这是一个例子

FragmentA

<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tool="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="#FFF"
     android:orientation="vertical">

    //Fragment A contents

</LinearLayout>

FragmentC

<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tool="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="#FFF"
     android:orientation="vertical">

     //Fragment C contents

  </LinearLayout>

观察两个片段的rootview中都设置了background属性。因此,虽然它们被覆盖,但一次只能看到一个。