返回 Activity / Fragment 历史记录时的 Android Back Button 行为

Posted

技术标签:

【中文标题】返回 Activity / Fragment 历史记录时的 Android Back Button 行为【英文标题】:Android Back Button behavior when going back through Activity / Fragment history 【发布时间】:2014-05-13 12:23:20 【问题描述】:

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

StartActivity:处理登录内容并在一切正常时启动 MainActivity MainActivity:有一个 NavigationDrawer,用户可以浏览应用程序。所有内容都显示在一个 Fragment 中,由 MainActivity 启动 SearchableActivity:MainActivity 的 ActionBar 具有启动搜索查询的搜索操作。这个查询被发送到这个活动,它只显示一些搜索结果

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

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

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

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

我开始实现自己的解决方案来破解: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);
    

【问题讨论】:

【参考方案1】:

重写 onKeyDown() 并处理事件

【讨论】:

这对我有什么帮助?【参考方案2】:

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

 super.onBackPressed()

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

【讨论】:

以上是关于返回 Activity / Fragment 历史记录时的 Android Back Button 行为的主要内容,如果未能解决你的问题,请参考以下文章

android Fragment跳转到Activity,再返回实现刷新Fragment(广播方法)

从 Activity 导航到 Fragment 并返回到 Activity 导致该 Activity 被多次创建

Demo记录Fragment 返回栈

如何将数据从Activity返回到Fragment

Activity嵌套Fragment 控制返回键

如何从 Back Press 的 Activity 中返回 Fragment