返回活动/片段历史记录时的Android Back Button行为

时间:2014-04-02 09:53:41

标签: android android-fragments

我有一个包含3项活动的应用程序:

  • StartActivity:处理登录内容并在一切正常时启动MainActivity
  • MainActivity:具有NavigationDrawer,用户可以浏览应用。所有内容都显示在由MainActivity
  • 启动的片段中
  • SearchableActivity:MainActivity的ActionBar有一个搜索操作,可以启动搜索查询。此查询将发送到此活动,该活动仅显示一些搜索结果

问题: 按下后退按钮不会返回片段历史记录,但我认为应该这样做。 MainActivitiy使用以下方法启动新碎片:

protected void displayFragment(Fragment fragment) {
    getFragmentManager()
            .beginTransaction()
            .replace(R.id.mainContentLayout, fragment)
            .addToBackStack(null)
            .commit();
}

应用程序只打开最后一个活动(在MainActivity的情况下始终是StartActivity),而不是打开最后一个Fragment。

如果我只是想要"默认行为"我做错了什么?没有破解自己的解决方案?

我开始实现一个自己的黑客解决方案:MaiNActivity覆盖onBackPressed函数并手动弹出堆栈中的最后一个Fragment。当计数太小时,我完成了应用程序,因此我的StartActivity不再被调用。但是,如果我想从SearchableActivity返回,那么这不起作用。

@Override
public void onBackPressed() {
    FragmentManager fragmentManager = getFragmentManager();
    int count = fragmentManager.getBackStackEntryCount();

    if (count > 0) {
        fragmentManager.popBackStackImmediate();
    } else {
        Intent startMain = new Intent(Intent.ACTION_MAIN);
        startMain.addCategory(Intent.CATEGORY_HOME);
        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startMain);
    }
}

2 个答案:

答案 0 :(得分:0)

覆盖onKeyDown()并处理事件

答案 1 :(得分:0)

实际上,这很容易。如果FragmentManager backstack的计数小于1,我可以简单地调用

 super.onBackPressed()

只会弹出后台堆栈中的下一个活动。这样,当用户按下后退按钮时,只要有片段就会弹出片段,当片段堆栈为空时,我会开始弹出活动。