addToBackStack后不能使用popBackStack()

ree*_*olt 26 android android-fragments

我的项目包含两个片段:

  • FragmentA:应用程序启动时默认加载的片段
  • FragmentB:替换fragmentA单击按钮完成时的操作.

这是我主视图的XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/main_fragment_container"
        android:name="fragmentA"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </fragment>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

当我想以取代FragmentAFragmentB,我用这个代码:

FragmentTransaction fragmentTransaction = getSupportFragmentManager()
            .beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.main_fragment_container, new FragmentB());
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.我的FragmentA被新的替换FragmentB.但是,当点击上后退按钮做的,我希望更换FragmentBFragmentA使用popBackStackImmediate().

这是我使用的代码:

if (getSupportFragmentManager().getBackStackEntryCount() > 0){
    boolean done = getFragmentManager().popBackStackImmediate();
    fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)

该函数popBackStackImmediate返回false并且FragmentB仍处于前台.

我打电话时为什么FragmentA不会替换FragmentB popBackStackImmediate?有人有想法解决我的问题吗?

提前致谢

owe*_*owe 45

您使用getSupportedFragmentManager()替换FragmentAFragmentB.但你打电话popBackStack()getFragmentManager().

如果您要将片段添加到android.support.v4.app.FragmentManager您还需要调用popBackStack()它们FragmentManager.

这段代码应该解决问题:

if (getSupportFragmentManager().getBackStackEntryCount() > 0){
    boolean done = getSupportFragmentManager().popBackStackImmediate();
}
Run Code Online (Sandbox Code Playgroud)


fas*_*que 7

问题是你是Fragment支持库中的混合和方法.

如果您使用的是支持库,请确保:

  • 你的Activity延伸android.support.v4.app.FragmentActivity
  • 你的Fragment延伸android.support.v4.app.Fragment
  • getSupportFragmentManager()得到android.support.v4.app.FragmentManager

你的代码Activity将是:

if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
   getSupportFragmentManager().popBackStackImmediate();
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想FragmentManagerFragment代码中获取,则必须使用getFragmentManager方法,如文档中所述(如果您没有太多经验,可能会导致一些混淆).

如果您不使用支持库:

  • 你的Activity延伸android.app.Activity
  • 你的Fragment延伸android.app.Fragment
  • getFragmentManager()得到android.app.FragmentManager

你的代码是:

if (getFragmentManager().getBackStackEntryCount() > 0) {
   getFragmentManager().popBackStackImmediate();
}
Run Code Online (Sandbox Code Playgroud)

fragmentTransaction.commit(); 在这两种情况下都没有必要,所以删除它.

另外,请在其他操作fragmentTransaction.addToBackStack(null);之前调用commit.


Soh*_*ziz 5

你应该打电话

fragmentTransaction.addToBackStack(null);
Run Code Online (Sandbox Code Playgroud)

执行所有操作后,例如add(),remove()和replace()以及在commit()之前.只有这时才会将此事务添加到Backstack中.只有这样,您才能使用" 返回"按钮返回到先前的片段状态.细节在这里.