在片段中处理 onBackPressed

Handling onBackPressed in Fragment

我在从片段中的列表导航到其详细片段时遇到了一些问题。

这是我的层次结构:

MainActivity (with NavigationDrawer)
              |
  ----- WrapperFragment-----
      |                 |
RequestsFragment   DetailFragment
      |
RequestListFragment

也就是说Wrapperfragment就是NavigationDrawer设置的Fragment。 这里面有 RequestsFragment,它包含一个带有多个 RequestListFragment 的 ViewPager。 通过单击一个项目,DetailFragment 应该是活动片段。按返回键,您应该会被带到 RequestListFragment。

基本上,我只想要一个支持选择项目、导航到其 DetailFragment 并通过按返回键返回导航的列表。 这就是我构建包装器的原因,它应该交换片段。

这是我的代码:

包装片段:

public void setList() {
  ...
  getChildFragmentManager().beginTransaction()
    .replace(R.id.request_wrapper, listfragment)
    .addToBackStack(null)
    .commit();
}

public void setDetail() {
  ...
  getChildFragmentManager().beginTransaction()
    .replace(R.id.request_wrapper, detailfragment)
    .addToBackStack(null)
    .commit();
}

当我点击一个列表项时,我看到了 DetailFragment,但是按下后退按钮关闭了应用程序而不是返回到 ListFragment。

你们能帮帮我吗?

谢谢!

P.S.: 我正在使用支持库

那是因为回到前面的Activity不是Fragment,还有none。你必须像这样捕捉它来手动处理后压;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        Log.d(this.getClass().getName(), "back button pressed");
    }
    return super.onKeyDown(keyCode, event);
}

或者像这样;

@Override
public void onBackPressed() {
    super.onBackPressed();
}

关于您的问题,您可以使用此代码手动弹出 Fragments backstack。

@Override
public void onBackPressed() {
    // if there is a fragment and the back stack of this fragment is not empty,
    // then emulate 'onBackPressed' behaviour, because in default, it is not working
    FragmentManager fm = getSupportFragmentManager();
    for (Fragment frag : fm.getFragments()) {
        if (frag.isVisible()) {
            FragmentManager childFm = frag.getChildFragmentManager();
            if (childFm.getBackStackEntryCount() > 0) {
                childFm.popBackStack();
                return;
            }
        }
    }
    super.onBackPressed();
}