[英]Navigating through Fragments in android without adding it into backstack
我正在使用android应用程序。 我正面临像在后台堆栈历史记录中添加片段的问题。 让我清楚地解释一下,我想从片段A导航到片段B,然后使用按钮单击片段B中的片段回到片段A。以上方案运行良好,在我单击设备中的向后箭头后导航到片段A后,导航到片段B。我不希望发生这种情况。 给我一个解决方案。 我的代码结构如下:
片段A:
.......
FragmentB fragmentB = new FragmentB();
showFragmentOmitStack(fragmentB);
....
public void showFragmentOmitStack(Fragment fragment) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.container,fragment);//add // replace
transaction.addToBackStack(null);
transaction.commit();
}
片段B:
FragmentA fragmentA = new FragmentA();
showFragment(fragmentA, "FragmentA");
public void showFragment(Fragment fragment, String back_stack_name) {
FragmentManager fragmentManager = thisActivity.getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.container, fragment);
fragmentTransaction.addToBackStack(back_stack_name);
fragmentTransaction.commit();
}
在“我的活动” java文件中:
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
if (getFragmentManager().getBackStackEntryCount() == 0) {
showAlertDialog(Constants.EXIT_APP, Constants.APP_NAME);
} else {
getFragmentManager().popBackStackImmediate();
}
}
}
尝试这个:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
}else {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
如果您不希望通过后退键返回到上一个片段,则在添加片段时不要将片段添加到backStack中,即删除该片段:
fragmentTransaction.addToBackStack(myFragmentName);
每个片段都有它自己的事务,因此当您使用addToBackStack
添加A时,多数民众赞成在片段A上! 在片段B事务中,将其设置为null,就是说B不会支持。 因此,后向堆栈中唯一会受到反向按压影响的片段是A!
在片段B上设置的按钮单击事件上,将您从那里移回片段A,只需删除
yourTransaction.addToBackStack(NULL);
并且您将很好走。
如果仅使用两个片段A和B,则可以执行以下操作:
在您的活动中
@Override
public void onBackPressed() {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
}
else if (currentFragment instanceOf FragmentB) {
Fragment fragmentA = new FragmentA();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, fragmentA);
fragmentTransaction.commit();
currentFragment = fragmentA;
}
else {
super.onBackPressed();
}
}
}
无需添加到后台堆栈中,只需在类中创建一个实例变量即可: Fragment currentFragment = null;
。 然后只需将currentFragment设置为您启动的片段即可。
addToBackStack(null)
仍将片段B添加到后堆栈中。 null参数只是后退堆栈状态的名称。 如果您不希望将片段添加到后台堆栈,则应在showFragmentOmitStack
方法中删除该行。
来源: https : //developer.android.com/reference/android/app/FragmentTransaction#addToBackStack(java.lang.String)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.