即使使用FragmentTransaction.addToBackStack(),后退按钮也会关闭应用程序

sco*_*eus 15 android back-button android-fragments back-stack

我在stackoverflow上读到的其他问题都没有能够解决我的问题.据我所知,我正在做的一切正确.

我有一个带片段的主/细节流.

创建主活动后,主片段将加载以下代码:

    Fragment frag;
    frag = new MainListFragment();//<-- **the master fragment**

    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.replace(R.id.fragment_container, frag);
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());
    transaction.commit();
Run Code Online (Sandbox Code Playgroud)

主片段有一个ListView; 单击列表项会显示详细信息片段,如下所示:

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
    super.onListItemClick(listView, view, position, id);


    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    SubListFragment frag = new SubListFragment();//<-- **the detail fragment**

    transaction.replace(R.id.fragment_container, frag);
    transaction.addToBackStack(null);
    transaction.commit();
    fm.executePendingTransactions();
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());

}
Run Code Online (Sandbox Code Playgroud)

现在,根据LogCat,我从主片段导航到细节片段后,BackStackEntryCount 从0变为1:在此输入图像描述

那么为什么当我在详细信息片段中单击后退按钮时,应用程序关闭而不是返回到主片段呢??????????

Bob*_*ke4 57

您必须将popBackStack()调用添加到onBackPressed()活动的方法中.

例如:

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

  • 它甚至没有在文档中提到它特别关于片段的后向导航.实际上它似乎表明了一些错误的东西:"当后端堆栈上有FragmentTransaction对象并且用户按下Back按钮时,FragmentManager会从后堆栈中弹出最近的事务并执行相反的操作." 谢谢谷歌.对Bobbake4的非讽刺感谢.http://developer.android.com/training/implementing-navigation/temporal.html#back-fragments (5认同)
  • @ScottScooterWeidenkopf:弹出"片段"是一种特殊的行为.BACK片段在"片段"之前很久就已经存在了,并且在核心Android代码中更改它的默认行为对于向后兼容性原因来说不是一个好主意.因此你需要自己处理事情的原因. (2认同)
  • 好吧,这是有道理的.我是个新人,所以我很容易忽视这些细节.谢谢您的帮助. (2认同)
  • 文档说的相反!"使用popBackStack()模拟后栈的弹出片段(用户模拟Back命令)." http://developer.android.com/guide/components/fragments.html非常令人不安.它没有提到onBackPressed().谢谢你的解决方案.我正在寻找一种自动方式,因为它感觉像是一个黑客. (2认同)