我在導航抽屜中列出了許多頁面/片段,用戶可能會經常在這些頁面/片段之間進行切換,我希望他們能夠在後臺導航,但是我只需要一個實例的背景中的每個片段,以便用戶不必爲了退出應用程序而壓倒瘋狂的次數。我無法弄清楚如何在沒有頁面被移除的情況下有效'重新排序'後臺'。Android Reorder Fragment Backstack
目前,當我改變頁面我是用這個代碼來改變片段,並確保它只是在後面堆一次
if (mFragMgr == null) {
mFragMgr = getSupportFragmentManager();
}
String backStateName = fragmentDescriptor.name();
boolean fragmentPopped = mFragMgr.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped){
mFragMgr.beginTransaction()
.remove((Fragment) mFragment)
.replace(R.id.content_frame, (Fragment) mFragment)
.addToBackStack(backStateName)
.commit();
}
我onBackPressed
使用此代碼@Override
public void onBackPressed() {
if (mFragMgr.getBackStackEntryCount() > 0) {
mFragMgr.popBackStackImmediate();
} else {
super.onBackPressed();
}
}
該作品但這意味着它會刪除我不想刪除的網頁。例如:
當我的用戶訪問6頁順序A > B > C > D > E > C
因爲我做了刪除我期待下面的堆棧:
[E] [C]
[D] [D] [E]
[C] [C] [C] [D]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]
但我實際上得到的是下面的 - 它彈出的一切達與名稱匹配的元素,這與我是否包含「.remove((Fragment)mFragment)」無關 - (我現在已經意識到remove不會影響後臺,所以不需要指向那出):
[E]
[D] [D]
[C] [C] [C] [C]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]
如果添加到堆棧中,我得到了以下的時候,不使用名稱,而是使用空:
[C]
[E] [E]
[D] [D] [D]
[C] [C] [C] [C]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]
我怎樣才能得到我所期望的行爲?有沒有可能,或者我需要自己記錄這些變化,並完全跳過後臺?
我試圖找到有效的方法來做到這一點,我把一些精力投入到我的問題 - 這將是很好,如果該人downvoting會有勇氣去說爲什麼 –
對不起,在'FragmentManager沒有方法'用於從後端堆棧中移除'Fragment'狀態的API。該API僅公開了推送和彈出的標準堆棧機制。 – corsair992
我認爲可能是這種情況。但我的用例看起來像是一個非常有效的,相當普遍的需求,並且您可以通過活動實現類似。我希望有人可能知道一個輔助類或其他東西來實現這個 –