片段addToBackStack()和popBackStackImmediate()不起作用

Ema*_*ele 26 android android-fragments back-stack

我目前正在构建一个Android应用程序(14 <= SDK <= 21),使用一个ActionBarActivity或多个Fragments,例如ListFragmentMapFragment,它们在一个FrameLayout视图中交换.

ActionBarActivity自动替换/提交片段A.然后,当用户点击一个按钮时,托管活动替换/提交一个新的不同片段B.我的目标是让用户在按下后退按钮时返回片段A .

现在有些代码了.

主要活动

public class MainActivity extends ActionBarActivity implements StopFragment.OnFragmentInteractionListener,
    StopItemFragment.OnFragmentInteractionListener {
...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fragmentManager = getFragmentManager();
        fragmentManager.enableDebugLogging(true);
        ...
        if (fragmentManager.findFragmentById(R.id.content_frame) == null) {
            StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment
            fragmentManager.beginTransaction()
                .replace(R.id.content_frame, list)
                .addToBackStack(null)
                .commit();
        }
        ...

        @Override
        public void onFragmentInteraction(String id) {
        selectItem(Integer.parseInt(id));
        }


       private void selectItem(int position) {
       StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment
       ...
       fragmentManager.beginTransaction()
            .replace(R.id.content_frame, fragment)
            .commit();

       ...
       }
}
Run Code Online (Sandbox Code Playgroud)


问题

即使addToBackStack()被调用,当我在片段B上时,我也无法返回片段A. MainActivity直接关闭.然而,我试图自己管理背堆,没有运气.我可以看到片段在堆栈上,但如果我调用popBackStackImmediate(),则弹出片段A并且不执行片段事务.(先回来什么都没发生,第二次活动关闭)

我还附加了FragmentManager logcat:http:
//pastebin.com/hFLHprL8

Nic*_*cks 71

对于那些仍在寻找解决方案的人.

在主Activity类(托管片段)中只需覆盖onBackPressed().

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}
Run Code Online (Sandbox Code Playgroud)

onBackPressed()片段中没有方法,这个方法只适用于activity.因此,当我们按后退键时,会显示默认行为activity,即

您将转到上一个活动(如果有)或应用程序将退出.

现在我们需要覆盖这个方法来告诉activity我们当我们按下后退键时,如果后面的堆栈中有任何碎片,则将它们弹出(这就是addToBackStack()进入图片时).否则请遵循默认行为.

  • 谢谢.我想知道为什么android文档没有提到这个重要的东西?或者我只是想念它... (2认同)

unc*_*sen 6

试试这个(注意为fragmentA 添加替换,为fragmentB 添加addToBackStack())

StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment
        fragmentManager.beginTransaction()
            .add(R.id.content_frame, list)
            .commit();
Run Code Online (Sandbox Code Playgroud)

StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment
   ...
   fragmentManager.beginTransaction()
        .replace(R.id.content_frame, fragment)
        .addToBackStack("FragmentB")
        .commit();
Run Code Online (Sandbox Code Playgroud)


Ema*_*ele 5

我不得不打电话beginTransaction()commit()FragmentManager手动.
通过覆盖解决onBackPressed():

@Override
public void onBackPressed() {
    ...
    if (fragmentManager.getBackStackEntryCount() > 1){
        fragmentManager.popBackStackImmediate();
        fragmentManager.beginTransaction().commit();
    } else {
        //handle finish
        finish(); // Closes app
    }
}
Run Code Online (Sandbox Code Playgroud)