【问题标题】:Navigation drawer with fragment and on back pressed带有片段和背面的导航抽屉
【发布时间】:2015-04-15 13:04:19
【问题描述】:

我有一个只有一个活动和几个片段的导航抽屉。 我的主要片段加载起来真的很重,所以我尝试将它保存在内存中,因为如果我不这样做,抽屉在我使用它时会变得迟钝。

为此,我有这样的布局:

<RelativeLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</RelativeLayout>

<fragment
    android:id="@+id/main_fragment"
    android:name=".MainFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

它们在同一个地方,但在代码中我用较轻的片段替换片段布局并显示/隐藏主要片段。 这是当我单击抽屉中的项目时调用的 showFragment 方法。

case 0: //Light Fragment
    fragment = getSupportFragmentManager().findFragmentByTag("light");
    if (fragment == null) {
        fragment = ProfileFragment.newInstance();
    }
    getSupportFragmentManager().beginTransaction().hide(getSupportFragmentManager().findFragmentById(R.id.main_fragment)).commit();
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment, "light").addToBackStack(null).commit();
break;
case 1: //Heavy Frag
    if (getActiveFragment() != null) {
        getSupportFragmentManager().beginTransaction().remove(getActiveFragment()).commit();
    }
    getSupportFragmentManager().beginTransaction().show(getSupportFragmentManager().findFragmentById(R.id.main_fragment)).addToBackStack(null).commit();
break;

除了我按下后退按钮外,它工作正常。我尝试了许多 onBackPressed 的实现,但我总是以主片段显示何时应该隐藏(因此 2 个片段彼此重叠)而主片段根本不显示。

额外问题:这是正确的做事方式吗?我的意思是避免抽屉滞后还是应该完全改变我的实现?

谢谢。

【问题讨论】:

  • 删除隐藏主要片段的行。使用 FragmentActivity,后退按钮现在应该按照片段的创建顺序移除片段。
  • 我不能使用 FragmentActivity 并且问题是一样的,因为如果我不隐藏 mainFragment(只是替换它),当我回到它时,我会得到一个滞后的过渡。

标签: android android-fragments navigation-drawer onbackpressed


【解决方案1】:

嗯,这应该更像是一个评论,但由于我无法评论,我必须回答。

原因可能是碎片没有正确或按应有的顺序进入后台堆栈。

我曾经创建了一个项目,其中我使用带有片段的导航抽屉。如果我理解正确,您想要的是转到最后一个打开的片段。

尝试使用以下代码:将其放入 onBackPressed()

    @Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
    this.finish();
} else {
    getFragmentManager().popBackStack();
}
}

本质上,您正在弹出添加到后台堆栈的最后一个片段。

【讨论】:

  • 这是我正在做的,但是当我回到主片段时它不起作用,因为他只是被隐藏了,而 popBackStack 没有显示它,。
  • 好吧,我可能错了,但我看到您正在删除片段,然后显示下一个片段(如案例:1)。尝试使用替换来更改片段(就像您在案例:0 中使用的那样)
  • 这行得通,但这就是我试图解释的,我不想替换它,因为如果我这样做,抽屉会滞后,这就是我只隐藏/显示它的原因
  • 在我看来,添加一个虚拟片段只是为了确保抽屉不会滞后,这表明代码中存在一些问题。人们总是可以使用其他技术优化应用程序/代码,而不是使用这样的方式。您可以在抽屉关闭后尝试加载片段或类似的东西。那将是一个更好的解决方案。
  • 我完全同意你的看法,这就是我最后所做的,我使用处理程序更改了片段,但有一些延迟,我删除了虚拟片段,因为我也觉得这是一个糟糕的解决方法,但我仍然很好奇我怎样才能完成这项工作。处理 backstack 对我来说一直很痛苦:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多