我编写了一个扩展View类的类来显示一些数据。用户需要能够通过单击它并在对话框中显示各种选项来操作此数据。
然而,我遇到的问题是,在Android中,要初始化AlertDialog.Builder实例,必须传入“this”(如在活动中)以使其工作(getApplicationContext()不起作用 - 请参阅此文章:Dialog throwing "Unable to add window — token null is not for an application” with getApplication() as context)
如何解决此问题并在我的类中显示扩展View的对话框?
答案 0 :(得分:3)
如果您需要从非视图类打开消息框,那么您有两个解决方案:
使用处理程序:http://developer.android.com/reference/android/os/Handler.html 在视图中创建一个处理程序,然后将其传递给您的类进行存储。当您想要呼叫消息框时,您将使用
handler.post(new Runnable(){// show messagebox here});
或者
在传递mecanism的上下文中注意内存泄漏
编辑:
我正在编写一些代码,以便在我抓住机会并参加文档时让您了解如何使用处理程序。通常没有任何用处,但对于这个特殊情况,哦奇迹,看看我发现,完整和易于理解的代码示例如何使用处理程序及其消息机制。它隐藏在可折叠标题下(“http://developer.android.com/guide/topics/ui/dialogs.html#ShowingAProgressBar”):http://developer.android.com/guide/topics/ui/dialogs.html#ShowingAProgressBar
评论后的EDIT2
因为op希望它的对象可以在不同的活动中重用,所以不使用处理程序而是将上下文(实际上是调用活动的链接)传递给对象是有意义的。然后,该对象将能够在dialog.builder中使用此上下文。
在名为MyActivity的活动类的oncreate中:
MyCustomObject myObject = new MyCustomObject(this);
在你的对象类
中Class MyCustomObject {
private MyActivity mContext;
void MyCustomObject(MyActivity context) {
this.mContext = context;
}
private showDialog(String message) {
AlertDialog.Builder alert = new AlertDialog.Builder(mContext);//we use the context
}
}
当你完成对象时,不要忘记破坏对话框构建器和mContext。这可能会很快泄漏内存。
答案 1 :(得分:0)
使用View.getContext()并将其传递到您的AlertDialog.Build
实例。
答案 2 :(得分:0)
您必须已发布一些代码,或者尝试使用
getParent();
而不是这个。请向我们展示一些代码