在android中通过片段导航而不将其添加到后台堆栈
我正在使用android应用程序。我面临的问题就像在后面的堆栈历史记录中添加碎片。让我解释清楚,我想从片段A导航到片段B,然后使用片段B中的按钮单击返回到片段A.上面的场景工作良好,在此导航到片段A后,当我点击设备中的后退箭头时导航到片段B.我不希望发生这种情况。给我一个解决方案。我的代码结构如下:在android中通过片段导航而不将其添加到后台堆栈
片段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();
}
}
}
如果你不打算回退到前一个片段,只是在添加片段时不要将片段添加到backStack,即删除t他:
fragmentTransaction.addToBackStack(myFragmentName);
每个片段都有它自己的事务,所以当你添加一个与addToBackStack
,那reffering到片段!在B片段交易中,您将其设置为无效,您说B不会进入后面。所以后台堆栈中唯一受后端压力影响的片段是A!
是的,我把它做成了空的transaction.addToBackStack(null);当从片段A到片段B调用时。 –
我想要片段B不要在backStack中添加 –
不!每个片段都有它自己的事务,所以当你使用addToBackStack添加A时,这就是片段A!在片段B事务中,您将其设置为空,您说B不会进入backStack。所以后台中唯一会受到后台压力影响的片段是A! – Ricardo
在那感动你回片段A从那里只是删除
yourTransaction.addToBackStack(空),您已经在片段B设置按钮点击事件;
你应该很好走。
如果你只有两个片段,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到你开始的片段。
试试这个:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
}else {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
当您单击B片段的按钮,不添加新的片段A,只是弹出堆栈中。你做这件事的方式就是成为A B A. – ElDuderino