下面是一段測試代碼,用於理解片段處理。第一個輸出是記錄片段列表。有2個:GameMenuFragment和Game1Fragment0。 然後記錄返回堆棧。它包含Game1Fragment0。 然後彈出後退堆棧。所以後來堆棧日誌顯示它沒有任何東西。 Bueno。 但是現在,通過片段列表再次循環,而size()仍然回到2,它在NPE上崩潰,因爲(顯然)Game1Fragment0不存在。
因此,顯然,彈出後退堆棧已從片段列表中刪除該片段,但大小仍然爲2. 有人可以解釋嗎?片段列表和BackStackEntry動態
輸出:
Game1Fragment(1617):fragmentList大小:2
Game1Fragment(1617):fragmentList:2131492865:GameMenuFragment
Game1Fragment(1617):fragmentList:2131492865:Game1Fragment0
Game1Fragment(1617):getBackStackEntryCount :1(從0開始)
Game1Fragment(1617):BackStackEntry:Game1Fragment0
Game1Fragment(1617):getBackStackEntryCount2:0(從0開始)
Game1Fragment(1617):fragmentList2大小:2
Game1Fragment(1617):fragmentList2:2131492865:GameMenuFragment
AndroidRuntime(1617):致命異常:主要
AndroidRuntime(1617):顯示java.lang.NullPointerException
FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager();
List<Fragment> fragmentList = fragmentManager.getFragments();
Log.w("Game1Fragment", "fragmentList size: " + fragmentList.size());
for (Fragment fragment : fragmentList) {
Log.w("Game1Fragment", "fragmentList: " + fragment.getId() + " : "+ fragment.getTag());
}
Log.w("Game1Fragment", "getBackStackEntryCount: " + fragmentManager.getBackStackEntryCount() + " (0-based)");
for(int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++){
Log.w("Game1Fragment", "BackStackEntry: " + fragmentManager.getBackStackEntryAt(entry).getName());
}
fragmentManager.popBackStackImmediate(); // pop Game1Fragment0
Log.w("Game1Fragment", "getBackStackEntryCount2: " + fragmentManager.getBackStackEntryCount() + " (0-based)");
for(int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++){
Log.w("Game1Fragment", "BackStackEntry: " + fragmentManager.getBackStackEntryAt(entry).getName());
}
List<Fragment> fragmentList2 = fragmentManager.getFragments();
Log.w("Game1Fragment", "fragmentList2 size: " + fragmentList2.size());
for (Fragment fragment : fragmentList2) {
Log.w("Game1Fragment", "fragmentList2: " + fragment.getId() + " : "+ fragment.getTag()); // throws NPE on 2nd time through loop
}
感謝您解釋列表中維護空引用的原因,而不是將它從列表中刪除。這回答了我的問題的一半。另一半涉及到後臺。從上面重申,我對後臺堆棧的理解是從後臺堆棧中彈出片段只是將其從後退按鈕的導航路徑中取出,因此我認爲這不會影響片段列表。然而我的測試代碼顯示,彈出'Fragment'會導致'Fragment'在列表中被設置爲null。 –
我已經更新了我的答案。 –
@mickey彈出後退堆棧後,您再次調用fragmentManager.getFragments()。這返回mActive,即活動片段的數組,其中彈出的片段被設置爲空。因此它是被接受的行爲。 –