返回活动/片段历史记录时的 Android 后退按钮行为



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

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

问题:按下后退按钮不会返回片段历史记录,尽管我认为它应该这样做。主活动使用以下方法来启动新的片段:

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

应用程序不会打开最后一个片段,而是简单地打开最后一个活动(在主活动的情况下,总是开始活动)。

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

我开始实现一个自己的解决方案来破解:MaiNActivity 覆盖 onBackPressed 函数,并手动从堆栈中弹出最后一个片段。当计数太小时,我会完成应用,以便不会再次调用我的 StartActivity。但是,如果我想从例如从可搜索活动返回,这是行不通的。

@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);
    }
}

覆盖 onKeyDown() 并处理事件

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

 super.onBackPressed()

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

最新更新