Android BackStack 抽屉导航

标签 android listview android-fragments navigation-drawer back-stack

过去几天我一直在处理一个问题,但似乎没有找到答案。

描述:我有一个主要 Activity ,其中包含抽屉导航。抽屉导航的每个项目(单击时)都会创建一个 fragment 。在该 fragment 中,有一个对象的 listView,单击时会创建其他 fragment 。在这些 fragment 中,我有另一个对象 ListView ,可以打开其他 fragment 。换句话说,存在一系列打开其他 fragment 的 fragment 。像这样的事情:

http://s22.postimg.org/pddo5gsv5/backstack.png

为了能够返回每个 fragment ,我实现了 addToBackstack("string") 方法。

我的问题是,如何为我的应用程序实现正确的后退堆栈,以便当我单击抽屉导航项时,已添加到后退堆栈的所有 fragment 都将被清除,而不会清除抽屉导航项打开的 fragment 。

如有任何帮助,我们将不胜感激。谢谢!

编辑

好吧,看来我已经弄清楚了。考虑到我从回复中收到的建议,以下是我提出的解决方案:

@Override
public void onBackPressed() {
    int count = getFragmentManager().getBackStackEntryCount();
    if (count != 0) {
        FragmentManager.BackStackEntry backEntry = getFragmentManager()
                .getBackStackEntryAt(
                        getFragmentManager().getBackStackEntryCount() - 1);
        if (backEntry.getName() == NAVIGATION) {
            finish();
        } else
            getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

用文字来说:首先,我甚至为顶级 fragment 添加了一个返回堆栈条目,并给了它们一个特定的标签。我已经重写了 Activity 的后退按钮功能,以便当最后一个后退堆栈条目是顶级 fragment 时才能完成该 Activity(这样它就不会简单地将 fragment 与 Activity 分离,将其置为空)。否则,如果最后一个条目不是顶级 fragment ,则执行 popBackStack。 PS:所有非顶级 fragment 都使用与顶级 fragment 不同的标签添加到后台堆栈中。另外,我必须在抽屉导航的点击监听器中执行 POP_BACK_STACK_INCLUSIVE。

getFragmentManager().popBackStack(null,
                FragmentManager.POP_BACK_STACK_INCLUSIVE);

感谢大家的建议,希望此编辑可以帮助其他用户。

最佳答案

您可以使用以下代码来解决您的问题:

getFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, fragment)
                    .addToBackStack(fragment_tag)
                    .commit();

为了使上面的代码工作,您必须动态创建 fragment 。因为硬编码 fragment 无法替换。为此,您可以创建一个容器(FrameLayout 等),在我们的示例中,该容器的 id 为 fragment_container。然后,上面的代码将动态地将 fragment 添加到容器中。最后,您必须将 fragment_tag 作为参数传递到 addToBackStack 方法中。这意味着,该事务将被添加到后台堆栈中。最后,为了从后台堆栈中获取它,您必须使用以下代码:

getFragmentManager().popBackStack(fragment_tag, FragmentManager.POP_BACK_STACK_INCLUSIVE));

POP_BACK_STACK_INCLUSIVE 标志确保“所有匹配的条目都将被消耗,直到找到不匹配的条目或到达堆栈底部。否则,直到但不包括该条目的所有条目都将被删除。”

关于Android BackStack 抽屉导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28072380/

相关文章:

安卓工作室 3.0 错误 : style attribute '@android:attr/windowEnterAnimation' not found

android - 实现滚动以选择项目 ListView

android - 如何在 android 中从 BackStack 加载 fragment

android - 将 YouTubePlayerFragment 与 FragmentActivity 和 ActionBarSherlock 一起使用时出现异常

android - 如果我在这个 fragment 之间导航多次,如何只为每个 fragment 保留一个实例

android - AppCompat 抽屉导航不让我关注任何 EditText

java - 如何在主布局中知道 ListView 已更改?

android - 更改可滚动 ListView 的背景颜色

php - 如何在 web 服务器上的 php 中运行 keytool 和 jarasigner

java - 带 fragment 的 ListView Volley