【问题标题】:Handling Fragment transitions: menu items from another fragment showing处理片段转换:来自另一个片段的菜单项显示
【发布时间】:2015-07-20 18:32:59
【问题描述】:

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

1) 主页

2) 网格视图

3) 流视图

我的流程是:

  • 您可以从主页视图转到网格视图
  • 您可以从网格视图转到流视图,反之亦然
  • 当您想从流视图或网格视图返回时,您应该进入主视图。

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

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

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

网格到流(不要将网格视图添加到后台堆栈)。 Stream to Grid View 类似。

    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) 有没有更简单、更干净的方法来做我想做的事?

【问题讨论】:

    标签: android android-fragments android-actionbar


    【解决方案1】:

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

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

    【讨论】:

    • 更新问题以使用 getSimpleName()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多