簡體   English   中英

在android中瀏覽Fragments而不將其添加到backstack

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM