处理片段转换:显示另一个片段的菜单项

时间:2015-07-20 18:33:00

标签: android android-fragments android-actionbar

我有一个应用程序,我有3个主屏幕。

1)主页

2)网格视图

3)流视图

我的流量是:

  • 您可以从主视图转到网格视图
  • 您可以从网格视图转到流视图,反之亦然
  • 当您想要从Stream或Grid View返回时,您应该登陆主视图。

使用菜单选项时,一切都很好。我有以下代码:

主视图到网格视图(将主视图添加到后台堆栈)

    getFragmentManager().beginTransaction()
            .replace(R.id.container, gridFragment)
            .addToBackStack(gridFragment.getTag())
            .commit();

网格到流(不要将网格视图添加到后台堆栈)。流到网格视图是类似的。

    getFragmentManager().beginTransaction()
            .replace(R.id.container, streamFragment)
            .commit();

网格到家。 Stream to Home类似:

    if (getFragmentManager().getBackStackEntryCount() > 0) {
                getFragmentManager().popBackStack();
    }

以上所有工作都很好。现在要处理设备上的硬件后退按钮,我的Activity中有以下方法。

  @Override
  public void onBackPressed() {
      if (getFragmentManager().getBackStackEntryCount() > 0) {
        if (GlobalState.getCurrentFragment().class.getSimpleName().equals(
                StreamFragment.class.getSimpleName())) {
            clearBackStackAndChangeFragment(HomeFragment.newInstance());
        } else if (GlobalState.getCurrentFragment().getClass().getSimpleName().equals(
                GridFragment.class.getSimpleName())) {
            clearBackStackAndChangeFragment(HomeFragment.newInstance());
        } else {
            getFragmentManager().popBackStack();
        }
      } else {
        super.onBackPressed();
      }
  }

  public void clearBackStackAndChangeFragment(Fragment fragment) {
    FragmentManager fm = getFragmentManager();
    fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    fm.beginTransaction().replace(R.id.container, fragment).commit();
  }

当用户从Home-> Grid-> Stream->来回...来回几次......-> Home通过硬件后退按钮时,我遇到了一个问题,其中操作栏上的顶部菜单中添加了Grid / Stream视图中的项目。看起来我在处理片段事务时做错了什么。

1)我做错了什么?

2)是否有更简单,更清洁的方式来做我想做的事情?

1 个答案:

答案 0 :(得分:0)

使用class.tostring(),这不会返回类名,而是字符串中的某种对象ID。所以改为使用 class.getSimpleName()....这将给出类名,并且代码中的if检查可能有效。

另外我的建议是使用带有标签而不是片段交易的视图寻呼机,因为它更易于处理和维护。