Android 如何使用其他对象显示AlertDialog

Android 如何使用其他对象显示AlertDialog,android,Android,我用一些常用的东西创建了一个类,比如祝酒词或对话。我给这个类命名为MyUtils。我在MyUtils中有以下几行代码。其中subYesNoDialogResult是boolean类型的私有变量 public void subYesNoDialog(Context appctx,String title,String mymessage) { AlertDialog.Builder builder = new AlertDialog.Builder(appctx); builde

我用一些常用的东西创建了一个类,比如祝酒词或对话。我给这个类命名为MyUtils。我在MyUtils中有以下几行代码。其中subYesNoDialogResult是boolean类型的私有变量

public void subYesNoDialog(Context appctx,String title,String mymessage)    {
   AlertDialog.Builder builder = new AlertDialog.Builder(appctx);
   builder.setMessage(mymessage)
     .setTitle(title)
     .setCancelable(false)
     .setPositiveButton(android.R.string.yes,
       new DialogInterface.OnClickListener(){
         public void onClick(DialogInterface dialog, int id) {
           subYesNoDialogResult = true;
         }
     })
     .setNegativeButton(android.R.string.no,
       new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {
           subYesNoDialogResult = false;
           dialog.cancel();
         }
     });
     AlertDialog alert = builder.create();      
     alert.show();
}
我有另外一门课,它是用来帮助主要的活动课的。我把这个类称为MyDbHelper。我试图调用上述函数以显示一个是/否对话框。这是为了在MyDbHelper类中执行某些过程之前,获取用户的输入以做出决策。但我做这件事时会得到NullPointerException。这是我的日志

I/ActivityManager(   67): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.xxx.geolog/.GeologActivity }
D/AndroidRuntime(  676): Shutting down VM
D/dalvikvm(  676): Debugger has detached; object registry had 1 entries
I/ActivityManager(   67): Start proc com.xxx.geolog for activity com.xxx.geolog/.GeologActivity: pid=683 uid=10040 gids={}
I/AndroidRuntime(  676): NOTE: attach of thread 'Binder Thread #3' failed
D/dalvikvm(   33): GC_EXPLICIT freed 244 objects / 9464 bytes in 704ms
D/dalvikvm(   33): GC_EXPLICIT freed 2 objects / 64 bytes in 350ms
D/dalvikvm(   33): GC_EXPLICIT freed 2 objects / 48 bytes in 536ms
W/GpsLocationProvider(   67): Duplicate add listener for uid 10040
W/WindowManager(   67): Attempted to add window with non-application token WindowToken{44f7d2a0 token=null}.  Aborting.
D/AndroidRuntime(  683): Shutting down VM
W/dalvikvm(  683): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime(  683): FATAL EXCEPTION: main
E/AndroidRuntime(  683): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime(  683):    at android.view.ViewRoot.setView(ViewRoot.java:509)
E/AndroidRuntime(  683):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime(  683):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime(  683):    at android.app.Dialog.show(Dialog.java:241)
E/AndroidRuntime(  683):    at com.xxx.geolog.SubLocationListener.onProviderDisabled(SubLocationListener.java:33)
E/AndroidRuntime(  683):    at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:204)
E/AndroidRuntime(  683):    at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:124)
E/AndroidRuntime(  683):    at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:140)
E/AndroidRuntime(  683):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  683):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  683):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(  683):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  683):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  683):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(  683):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(  683):    at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(   67):   Force finishing activity com.xxx.geolog/.GeologActivity
W/ActivityManager(   67): Activity pause timeout for HistoryRecord{45030820 com.xxx.geolog/.GeologActivity}

我怎样才能解决这个问题?我做错什么了吗?

似乎您没有将参数
上下文appctx
传递给该方法

是否尝试使用应用程序上下文显示对话框?
如果是这样的话,试着使用活动上下文,看看它是否有区别。

实际上还有另一点。我得到了应用程序上下文,正如mibollma所说,它实际上是一个活动上下文,它是这个应用程序中唯一一个提供GUI的活动。我得到它,并将类型转换应用于活动,并显式设置所有者活动。这里的要点是,每个对话框都需要一个所有者。如果它们在活动类中使用,则父活动将成为隐式所有者。如果它们在活动类之外使用,您需要

dialog\u instance.setOwnerActivity(活动所有者)

在我的例子中,alert.show()上面的这一行解决了这个问题

alert.setOwnerActivity((活动)appctx)

谢谢你的支持