我正在开发一款应用。我想从第一个活动调用一个警告对话框。警报对话框写在另一个非活动类的类中。应用程序的需要是调用活动应该从非活动类中写入的警报完成。调用警报的代码如下。
从第一项活动中拨打警报:
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);
}
}
具有警报对话框的被叫类是:
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();
}
}
但是这给我的错误是:
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
答案 0 :(得分:9)
而不是:
Utility.callAlert(message, getApplicationContext());
使用:
Utility.callAlert(message, Activity1.this);
和
public void onClick(DialogInterface dialog, int which) {
((Activity)context).finish();
}
答案 1 :(得分:1)
试试这个:
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();
}
}
答案 2 :(得分:0)
试试这个,你没有创建Dialog
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context).create();
答案 3 :(得分:0)
我想我知道你的回答,因为我自己曾经做过一次。这是我的代码,它运作良好!
((活动)上下文)可用于调用您的活动。
NonActivityClass nonActivityClass = new NonActivityClass(YourActivityClass.this);
nonActivityClass.finishIt();
这是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
}
}
此外,它还可用于从非Activity类运行UI线程。例如,
((Activity)context).runOnUiThread() {
//Your stuff here!
}
希望它可以帮到你!
答案 4 :(得分:-4)
在活动中,创建一个新类
static public void finishThisActivity() {
finish();
}
并从对话框类中调用它
YourActivityName.finishThisActivity();
或尝试
YourActivityName.finish();