2011-10-17 30 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

我站正确:) –

相关问题