我正在使用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();
}
}
}
答案 0 :(得分:1)
试试这个:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
}else {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
答案 1 :(得分:0)
如果您不打算使用背压返回上一个片段,则在添加片段时不要将片段添加到backStack,即删除它:
fragmentTransaction.addToBackStack(myFragmentName);
每个片段都有自己的事务,所以当你用addToBackStack
添加A时,那就是片段A!在片段B事务中,你将它设置为null,你说B不会进入后面。因此,背压中唯一会受到背压影响的片段是A!
答案 2 :(得分:0)
在片段B上设置的按钮单击事件,将您从那里移回片段A,只需删除
yourTransaction.addToBackStack(空);
你会好起来的。
答案 3 :(得分:0)
如果您只使用两个片段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设置为您启动的片段。
答案 4 :(得分:0)
addToBackStack(null)
仍将片段B添加到后堆栈中。 null参数只是后退堆栈状态的名称。如果您不希望将片段添加到后台堆栈,则应在showFragmentOmitStack
方法中删除该行。