[英]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.