浏览android中的Fragments而不将其添加到backstack中

时间:2017-09-15 10:32:24

标签: java android fragment

我正在使用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();
            }
        }
    }

5 个答案:

答案 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方法中删除该行。

来源:https://developer.android.com/reference/android/app/FragmentTransaction#addToBackStack(java.lang.String)