在片段中处理 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();
}
我在从片段中的列表导航到其详细片段时遇到了一些问题。
这是我的层次结构:
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();
}