问题
I am developing an app. I want to call a alert dialog from 1st activity. The alert dialog is written in another class which is a non activity class. The need of application is that the calling activity should finish from alert which is written in non activity class. The code of calling the alert is as below.
Calling the alert from 1st activity:
public class Activity1 extends Activity {
/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_layout);
}// End of onCreate.
/** Back Button. */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
String message = "Do you Want to Exit.";
Utility.callAlert(message, getApplicationContext());
return true;
}
return super.onKeyDown(keyCode, event);
}
}
And the called class having alert dialog is :
public class Utility {
// callAlert method to display alert, when exception occur.
public static void callAlert(String message, final Context context){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle("MyApplication.");
alertDialogBuilder.setMessage(message);
alertDialogBuilder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
((Activity1)context.getApplicationContext()).finish();
} //end onClick.
}); // end alertDialog.setButton.
alertDialogBuilder.show();
}
}
But this gives me the error as :
02-25 17:00:45.961: D/AndroidRuntime(444): Shutting down VM
02-25 17:00:45.961: W/dalvikvm(444): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-25 17:00:45.971: E/AndroidRuntime(444): FATAL EXCEPTION: main
02-25 17:00:45.971: E/AndroidRuntime(444): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
02-25 17:00:45.971: E/AndroidRuntime(444): at android.view.ViewRoot.setView(ViewRoot.java:531)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.app.Dialog.show(Dialog.java:241)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
02-25 17:00:45.971: E/AndroidRuntime(444): at com.xxx.myapp.specialclasses.Utility.callAlert(Utility.java:25)
02-25 17:00:45.971: E/AndroidRuntime(444): at com.xxx.myapp.activities.Activity1.onKeyDown(Activity1.java:149)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.view.KeyEvent.dispatch(KeyEvent.java:1256)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.app.Activity.dispatchKeyEvent(Activity.java:2078)
02-25 17:00:45.971: E/AndroidRuntime(444): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.os.Handler.dispatchMessage(Handler.java:99)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.os.Looper.loop(Looper.java:123)
02-25 17:00:45.971: E/AndroidRuntime(444): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-25 17:00:45.971: E/AndroidRuntime(444): at java.lang.reflect.Method.invokeNative(Native Method)
02-25 17:00:45.971: E/AndroidRuntime(444): at java.lang.reflect.Method.invoke(Method.java:507)
02-25 17:00:45.971: E/AndroidRuntime(444): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-25 17:00:45.971: E/AndroidRuntime(444): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-25 17:00:45.971: E/AndroidRuntime(444): at dalvik.system.NativeStart.main(Native Method)
02-25 17:05:46.061: I/Process(444): Sending signal. PID: 444 SIG: 9
回答1:
instead of:
Utility.callAlert(message, getApplicationContext());
use:
Utility.callAlert(message, Activity1.this);
and
public void onClick(DialogInterface dialog, int which) {
((Activity)context).finish();
}
回答2:
try this:
public class Utility {
// callAlert method to display alert, when exception occur.
public static void callAlert(String message, final Activity activity){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
alertDialogBuilder.setTitle("MyApplication.");
alertDialogBuilder.setMessage(message);
alertDialogBuilder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
activity.finish();
} //end onClick.
}); // end alertDialog.setButton.
alertDialogBuilder.show();
}
}
回答3:
I think I know your answer because I've done it myself once. Here's my code and it works well!
((Activity)context) can be used to call your Activity.
NonActivityClass nonActivityClass = new NonActivityClass(YourActivityClass.this);
nonActivityClass.finishIt();
Here's NonActivityClass.
public class NonActivityClass() {
private Context context;
public NonActivityClass(Context context) {
this.context=context;
}
public void finishIt() {
//Remember to import android.app.Activity; in this class!
((Activity)context).finish(); //This destroy the your activity class
}
}
Also, it can be used to run your UI thread from non-Activity class. For example,
((Activity)context).runOnUiThread() {
//Your stuff here!
}
Hope it helps you!
回答4:
Try this, You are not creating Dialog
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context).create();
回答5:
In the activity, create a new class
static public void finishThisActivity() {
finish();
}
and call it from your dialog class
YourActivityName.finishThisActivity();
or try
YourActivityName.finish();
来源:https://stackoverflow.com/questions/15066378/finish-activity-from-non-activity