【问题标题】:Fragment Navigation with Navigation Drawer带有导航抽屉的片段导航
【发布时间】:2014-12-29 03:39:51
【问题描述】:

我的 Android 应用确实有点问题。

我的应用程序包含一个导航抽屉,用于在应用程序内部导航。 例如

导航抽屉:

  1. 概述
  2. 搜索
  3. 用户
  4. 东西

当应用程序启动时,我将加载概览片段。 如果用户单击其他项目,我将更改片段:

final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, fragment, TAG);
transaction.addToBackStack(null);
transaction.commit();

现在的问题是,当用户切换,例如,从 1 > 2 > 4 > 3 并且他们按下返回键时,它只会让他返回一个片段。 3 > 4 > 2 > 1

所以我添加了代码,这将使他在每次 Backpress 时回到 Fragment 1。

public boolean onKeyDown(int keyCode, KeyEvent event) {
    int exit = 0;


    if (keyCode == KeyEvent.KEYCODE_BACK) {


        getFragmentManager().popBackStack();
        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = new Overview();
        fm.beginTransaction().add(R.id.frame_container, fragment).addToBackStack("fragBack").commit();
        return false;
    }
    return false;
}

好的,一开始没问题,但现在我在更深层次上添加了更多片段,但它们不应该在后按时返回片段 1。

举例

  1. 概述(主要片段)
  2. 搜索(返回键返回片段 1)
  3. 用户(返回键返回片段 1)
  4. Stuff(返回键返回片段 1)

4.1 细节(Back Key 回到 Fragment 4. Stuff)

如果有人知道我如何在我的应用中处理导航,那就太好了。

问候

【问题讨论】:

  • 是否有特定的原因使后退按钮的行为如此?通常用户会希望后退按钮将他们带到上一个屏幕,而不是主屏幕。
  • transaction.replace 将删除您当前的片段并添加新片段。当进入更深层次的片段时,您应该使用transaction.add,以便将其添加到后台堆栈中。
  • 是的,所以应用程序的主要活动是概览,如果您从概览转到设置,然后再转到搜索,如果您按返回键,您不想返回设置

标签: android android-fragments navigation navigation-drawer fragment-backstack


【解决方案1】:

您的代码是正确的,需要更改逻辑。 每当你从导航抽屉中走出来时,首先你使用这段代码清除堆栈中的所有片段

private void clearBackStack() {
    FragmentManager manager = getSupportFragmentManager();
    manager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
} 

其次,将相应的选定(1 或 2 或 3)片段添加到堆栈中。

private void navigateToFragment(Fragment fragment, String TAG){
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.frame_container, fragment, TAG);
    transaction.addToBackStack(null);
    transaction.commit();
}

当你像 2 -> 2.1 -> 2.2 那样深入时,在背压时你将返回 2.2 ->2.1 ->2。 无需重写 onKeyDown() 方法并再次添加片段

【讨论】:

  • 这个想法很好,但是当我在导航到另一个 Fragment 之前清除 BackStack 时,如果按下 Backkey,我就无法返回到 Overview Fragment
  • ok...然后覆盖 onBackPressed() 方法并检查 backstackentry 计数,如果为 0,则调用您的 OverviewFragment
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多