在我的開源Android應用程序中,發現了一個問題,即在特定情況下特定片段會在另一個片段的頂部進入視圖或崩潰應用程序。正確/最好的方式來處理Android片段交易問題
在GitHub上,如果你想看到更多的信息,例如屏幕截圖中的問題: https://github.com/rpi-mobile/RPIMobile-Android/issues/31
我有牽制的原因,但想知道哪些在android.support.v4.app包的方法用來解決問題。
在MainActivity.java
中,是導航抽屜的代碼,它使用FragmentTransaction.replace()
來切換片段。
問題的產生是因爲在MapFragment
,我使用:
ViewMapFragment vmf = new ViewMapFragment();
FragmentTransaction ft = getSherlockActivity().getSupportFragmentManager().beginTransaction();
ft.addToBackStack(null);
ft.replace(R.id.content_frame, vmf);
ft.commit();
而且在ViewMapFragment
的onDestroyView()
:
FragmentManager fm = getSherlockActivity().getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fm.findFragmentById(R.id.mapview));
ft.commit();
的onDestroyView()
正確去除鑑於ViewMapFragment
,但如果你擁有了它在查看和使用導航抽屜改變到不同的片段,MapFragment
仍然在後面的堆棧上。
所以,我的問題:
1)如何檢查如果一個特定的片段後棧試圖刪除/更換之前,或者如果您嘗試沒事的時候是將應用程序不會崩潰有(即不檢查)?例如。當背面堆棧上沒有任何東西時調用popBackStack()
。
2)我是否應該使用FragmentManager
類方法嘗試從背堆棧中刪除MapFragment
,或者我應該使用FragmentTransaction
方法?優點vs缺點?
3)popBackStack()
和popBackStackImmediate()
之間的界面有什麼不同?用戶是否看到一些令人毛骨悚然的轉變?
謝謝你的回答!我將使用您的一線解決方案。作爲對你答案的反饋,除了間接地回答問題2,你沒有完全回答問題1,而你對問題2的回答可能會稍微更具體一些,以便在關聯答案中查找的位置,因爲我必須梳理關於該問題的評論頁。 – pdpiech 2014-09-14 00:13:47
不幸的是,這個問題沒有一個好的解決方案(在API中使用clearBackstack方法會很好,但是沒有這種方法)。我必須在我的項目中實現我自己的後退堆棧系統,因爲這個問題和轉換故障,同時清除後臺堆棧(我使用相當自定義的轉換動畫)。 :( – Ayzen 2014-09-14 10:23:09
我已經添加了更多關於1&2問題的信息。希望這有幫助。 – Ayzen 2014-09-14 12:01:22