开发者

How to show an AlertDialog using another object

I had created a class with some stuff I commonly use, like toasts or dialogs. I named this class MyUtils. I had the following lines of code inside MyUtils. Where subYesNoDialogResult is a private variable of type 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();
}

I had another class which is used help the main activity class for certain purpose. I call this class MyDbHelper. I tried to call the above function to show up a Yes/No dialog. This is specifically to get the user's input to make a decision before doing some process inside MyDbHelper class. But I get NullPointerException on doing this. Here is my logcat out put.

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(Lo开发者_如何学运维cationManager.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}

How can I fix this? Did I do something wrong?


Are you trying to use the application context to show a dialog? If so try to use an activity context instead to see if it makes a difference.


Actually there is another point. I get the app context, as mibollma said, which is actually an activity context which is the one and only activity in this application which provides the GUI. I get it, and apply type cast to Activity and explicitly set an owner activity. The point here is that, every dialog requires an owner. If they are used inside an Activity class, then the parent activity will become the implicit owner. And if they are used outside an Activity class, you need

dialog_instance.setOwnerActivity(Activity owner);

So in my case, this one line just above alert.show() fixed the issue!

alert.setOwnerActivity((Activity)appctx);

Thanks for your support


Seems like you are not passing the argument Context appctxto the method.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜