我已经实现了导航抽屉,它是Activity的一个子类。我的应用程序中有很多片段。我的问题在这里
假设有3个片段:
Fragment_1 : Fragment_2 : Fragment_3
当我启动我的应用程序时,当我点击Fragment_1上的一些组件时,Fragment_1会被加载,我被导航到Fragment_2,等等。
所以这就像
Fragment_1 > Fragment_2 > Fragment_3
当我从Fragment_2按BACK键时,我被导航回Fragment_1,但当我从Fragment_3按BACK键时,我被导航回Fragment_1 (而不是Fragment_2)
我希望在我的后退键应用程序中有类似这样的东西
Fragment_1 < Fragment_2 < Fragment_3
我使用了Fragment、FragmentManager、FragmentTransaction,如下所示:
MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit();
我尝试在我的MainActivity中重写onBackPressed():
@Override
public void onBackPressed() {
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0)
super.onBackPressed();
}
发布于 2014-08-17 23:27:00
您必须实现您自己的backstack实现,如下所述
Separate Back Stack for each tab in Android using Fragments
您可以在单击片段中的后退按钮时调用popFragments(),并在从一个片段导航到另一个片段时调用pushFragments()。
总之,
public void onBackPressed()
{
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack();
}
发布于 2016-05-04 00:24:26
tric在FragmentManager#executePendingTransactions();
中。
这也是我用于嵌套片段的原因...:
/**
* 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.
*
* @param fm the fragment manager to which we will try to dispatch the back pressed event.
* @return {@code true} if the onBackPressed event was consumed by a child fragment, otherwise
*/
public static boolean dispatchOnBackPressedToFragments(FragmentManager fm) {
List<Fragment> fragments = fm.getFragments();
boolean result;
if (fragments != null && !fragments.isEmpty()) {
for (Fragment frag : fragments) {
if (frag != null && frag.isAdded() && frag.getChildFragmentManager() != null) {
// go to the next level of child fragments.
result = dispatchOnBackPressedToFragments(frag.getChildFragmentManager());
if (result) return true;
}
}
}
// if the back stack is not empty then we pop the last transaction.
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
fm.executePendingTransactions();
return true;
}
return false;
}
在我的onBackPressed
中:
if (!FragmentUtils.dispatchOnBackPressedToFragments(fm)) {
// if no child fragment consumed the onBackPressed event,
// we execute the default behaviour.
super.onBackPressed();
}
发布于 2015-09-25 12:23:34
在主活动中的选项卡更改上使用此代码来清除堆栈。
int count = getFragmentManager().getBackStackEntryCount();
if(count>0){
for (int i = 0; i <count; i++) {
getFragmentManager().popBackStack();
}
}
然后在你的主要活动的背部按下,这样做
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onbackpressed();
}
else {
getFragmentManager().popBackStack();
}
}
https://stackoverflow.com/questions/25350397
复制相似问题