2011-05-07 53 views
0

我使用兼容性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中都複製任何生命週期管理代碼。

在此先感謝。彼得。

回答

0

確定一些死結後,我終於設法通過在我的消息處理程序中實現以下功能來獲得我想要的功能,以便將消息發佈到片段的消息處理程序中,並使用'show(.. )'顯示所有對話框:

new Handler().post(new Runnable() { 
    public void run() { 
     FragmentManager fm = fragment.getFragmentManager(); 
     DialogFragment fd = (DialogFragment) fm.findFragmentByTag(d1Tag); 
     if (fd != null) { 
      fm.beginTransaction().remove(fd).commit(); 
     } 
    } 
}); 
相關問題