2011-10-17 51 views
1

我們的應用程序使用嵌套的對話框,並且我們已經成功地通過從第一個對話框的getContext()方法構建一個對話框位於另一個對話框的頂部。所以:Dialog.getContext()和創建對話框的Activity之間有區別嗎?

活動:

//... 
Dialog1 dialog = new Dialog1(this); 
dialog.show(); 
//... 

Dialog1:

//... 
Dialog1(Context context) { 
    super(context); 
    //etc. 
} 

public void onSomeCondition() { 
    Dialog2 dialog2 = new Dialog2(getContext()); 
    dialog2.show(); 
    //etc. 
} 

但是,我們希望直接從活動啓動Dialog2而Dialog1仍是可見的一種情況。所以我們把這個方法的活動:

public void onSomeOtherCondition() { 
    Dialog2 dialog = new Dialog2(this); //crunch 
    dialog.show(); 
    //etc. 
} 

窗口管理器不喜歡這樣的。那麼它是不是getContext()與活動中的ContextWrapper-完全不一樣?如果確實如此,次要上下文與主要上下文有什麼不同,並且如果(例如)您從對話返回getContext()到調用Activity,是否會產生與持有其他位置上的Context引用相同的泄漏風險?

如果不是上下文,是什麼導致了問題?

回答

1

我並不完全確定上下文是否不同(它們會出現),但我懷疑問題在於在嘗試從Activity中啓動Dialog2之前,您並沒有關閉Dialog1。 WindowManager可能會生氣,因爲您正試圖在您的活動之上啓動一個對話框,但Dialog1已經在那裏。

長話短說,我想你需要:

public void onSomeOtherCondition() { 
     this.dismiss(); 
     mActivity.onSomeOtherCondition(); //we have a reference to the activity 
    } 

編輯

我在評論中提出的解決方案是Dialog1的上下文傳遞給mActivity.onSomeOtherCondition,這樣就可以與創建Dialog2位於堆棧頂部的上下文。

+0

幾乎可以肯定,但它允許我們在之前的第一個對話框中打開第二個對話框(如下例所示:我們在Dialog1中創建Dialog2):沒有問題)。如果可以的話,我們寧願保留原來的一個,因爲在這種情況下對用戶更有意義(次要的是「加載...」類型的對話框)。這就是爲什麼我對上下文感興趣以及它做什麼的原因!謝謝:) –

+0

我想我們可以在Activity中保留一堆'Dialog'對象,並確保我們從最上面的那個'getContext()'...? –

+1

您可以將上下文傳遞到onSomeOtherCondition以創建對話框。這可能更容易。 –

1

我懷疑在對話框1可見時從活動1啓動對話框2的問題是因爲對話框1(不是活動1)位於活動堆棧的頂部。我絕不是專家,但我懷疑只有活動堆棧頂部的活動可以開始新活動。

+0

嗯,這是一個視圖,而不是一個活動,但我懷疑這是沿着你描述的方向,是的。 –

+1

事實上,在技術上正確的一個對話框既不是'視圖'或'活動'。他們是'java.lang.Object'的直接子類 – slayton

+0

我站正確:) –

相關問題