我使用兼容性libray將代碼移植到Honeycomb。我的預端口代碼的工作原理如下,我有活動A,B和對話框D1和D2。 B有一個消息處理程序從別處接收消息。當從片段調用時,DialogFrament對話框以錯誤的順序出現
A調用B,它在消息(1)上通過調用showDialog來顯示D1。上的消息(2)如果用戶沒有被駁回D1已經然後它用下面的代碼被駁回,然後顯示D2:
if (D1.isShowing()) {
D1.dismiss();
}
這工作得很好。
對於我移植的代碼,加載一個Fragment,FB(包含消息處理程序),並且D1和D2現在從DialogFragment派生。我已經修改我的代碼,以便使用顯示的對話框:
dlg.show(fragmentManager, tag);
,並在支票上面通過執行:
if (D1.isVisible()) {
D1.dismiss();
}
但是,這是行不通的。首先顯示D2,然後顯示解除D1的情況。我假設這是因爲D1進行上述檢查時不可見,並且D2被添加到棧頂,這就是爲什麼它首先出現(D2的onCreateView在D1之前被調用)。
現在,我已經試過各種事情都無濟於事:
1)通過獲取事務管理器,看到檢查的知名度,如果D1是在堆棧中。 2)使用顯示的對話框:
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(0, dlg);
ft.commit();
或使用替代/刪除,而不是添加
3)當visibity檢查做到以下幾點:
FragmentManager fm = fragment.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment.D1tag).ft.commit();
現在3)確實有點因爲在某些情況下沒有找到片段(例如,早期關閉對話框),所以除非它不工作並且拋出illegalStateException,否則工作。
有關我該如何解決這個問題的任何想法,或者我是否真的在考慮這種完全錯誤的方式,也許活動應該控制對話框的生命週期?應該提到的是,對於我之前的Honeycomb應用程序活動B現在是一個裝載FB的包裝活動,因此我不想在A和B中都複製任何生命週期管理代碼。
在此先感謝。彼得。