在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(); 
      } 
     } 
    } 
+0

当您单击B片段的按钮,不添加新的片段A,只是弹出堆栈中。你做这件事的方式就是成为A B A. – ElDuderino

如果你不打算回退到前一个片段,只是在添加片段时不要将片段添加到backStack,即删除t他:

fragmentTransaction.addToBackStack(myFragmentName); 

每个片段都有它自己的事务,所以当你添加一个与addToBackStack,那reffering到片段!在B片段交易中,您将其设置为无效,您说B不会进入后面。所以后台堆栈中唯一受后端压力影响的片段是A!

+0

是的,我把它做成了空的transaction.addToBackStack(null);当从片段A到片段B调用时。 –

+0

我想要片段B不要在backStack中添加 –

+0

不!每个片段都有它自己的事务,所以当你使用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(); 
     } 
    } 
}