3 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
說明:這是怎么回事?
如果我們牢記這.replace()一點.remove().add(),我們將通過文檔了解這一點:
替換添加到容器中的現(xiàn)有片段。這本質(zhì)上與調(diào)用remove(Fragment)所有當前添加的片段相同,這些片段在此處添加了相同的參數(shù)containerViewId,然后又add(int, Fragment, String)添加了相同的參數(shù)。
然后發(fā)生的事情是這樣的(我在片段中添加數(shù)字以使其更清楚):
// transaction.replace(R.id.detailFragment, frag1);
Transaction.remove(null).add(frag1) // frag1 on view
// transaction.replace(R.id.detailFragment, frag2).addToBackStack(null);
Transaction.remove(frag1).add(frag2).addToBackStack(null) // frag2 on view
// transaction.replace(R.id.detailFragment, frag3);
Transaction.remove(frag2).add(frag3) // frag3 on view
(這里所有誤導性的東西開始發(fā)生)
請記住,.addToBackStack()只保存事務而不保存片段本身!所以現(xiàn)在我們有了frag3布局:
< press back button >
// System pops the back stack and find the following saved back entry to be reversed:
// [Transaction.remove(frag1).add(frag2)]
// so the system makes that transaction backward!!!
// tries to remove frag2 (is not there, so it ignores) and re-add(frag1)
// make notice that system doesn't realise that there's a frag3 and does nothing with it
// so it still there attached to view
Transaction.remove(null).add(frag1) //frag1, frag3 on view (OVERLAPPING)
// transaction.replace(R.id.detailFragment, frag2).addToBackStack(null);
Transaction.remove(frag3).add(frag2).addToBackStack(null) //frag2 on view
< press back button >
// system makes saved transaction backward
Transaction.remove(frag2).add(frag3) //frag3 on view
< press back button >
// no more entries in BackStack
< app exits >
可能的解決方案
考慮實現(xiàn)FragmentManager.BackStackChangedListener以觀察后向堆棧中的更改,并在onBackStackChanged()methode中應用您的邏輯:
跟蹤交易計數(shù);
通過名稱檢查特定交易 FragmentTransaction.addToBackStack(String name);
等等。

TA貢獻1818條經(jīng)驗 獲得超11個贊
對?。?!經(jīng)過多拉頭發(fā),我終于弄清楚了如何使其正常工作。
似乎在按下后退按鈕時并未從視圖中刪除片段[3],因此您必須手動進行操作!
首先,不要使用replace(),而要分別使用remove和add。似乎replace()無法正常工作。
下一步是重寫onKeyDown方法,并在每次按下后退按鈕時刪除當前片段。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
if (getSupportFragmentManager().getBackStackEntryCount() == 0)
{
this.finish();
return false;
}
else
{
getSupportFragmentManager().popBackStack();
removeCurrentFragment();
return false;
}
}
return super.onKeyDown(keyCode, event);
}
public void removeCurrentFragment()
{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.detailFragment);
String fragName = "NONE";
if (currentFrag!=null)
fragName = currentFrag.getClass().getSimpleName();
if (currentFrag != null)
transaction.remove(currentFrag);
transaction.commit();
}
希望這可以幫助!
- 3 回答
- 0 關(guān)注
- 472 瀏覽
添加回答
舉報