在Fragment中处理onBackPressed

时间:2015-10-15 08:15:03

标签: android android-fragments fragmentmanager

我有一些问题从Fragment中的列表导航到其详细信息片段。

这是我的等级:

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

换句话说,Wrapperfragment是NavigationDrawer设置的Fragment。 在其中有RequestsFragment,它包含一个带有多个RequestListFragments的ViewPager。 通过单击项目,DetailFragment应该是活动片段。通过按回,您应该被带到RequestListFragment。

基本上,我只想拥有一个支持选择项目的列表,导航到其DetailFragment并通过按下后退导航。 这就是为什么我构建了Wrapper,它应该交换碎片。

这是我的代码:

WrapperFragment:

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();
}

当我点击一个listitem时,我会看到DetailFragment,但是后退会关闭应用程序而不是将我带回ListFragment。

你能帮帮我吗?

谢谢!

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

1 个答案:

答案 0 :(得分:3)

那是因为回到之前的Activity not Fragment,而没有。你必须像这样捕捉它来手动处理背压;

@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();
}