我目前有一个应用程序,它有很多活动,需要有办法在这些活动之间保持状态。
我使用Application类来执行此操作,声明我的全局变量并使用getter和setter与我的活动进行交互。
我希望在那里放置一些自定义方法,这样当我想做一个常见的任务,例如显示错误信息时,我可以在我的应用程序类中声明该方法并从任何活动中调用它使用它
EscarApplication application = (EscarApplication) this.getApplication();
EscarApplication是我上面的应用程序类的名称。
我试图在我的应用程序类中包含此方法:
public void showError(String title, String message) {
Log.i("Application level",message);
this.alertDialog.setTitle(title);
alertDialog.setMessage(message);
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
return;
}
});
alertDialog.show();
}
希望我可以从活动中调用此方法而不必重新声明它,但是当我使用下面的内容调用它时,我得到一个空指针异常:
Visit.this.application.showError("Update error", "An error has occurred while trying to communicate with the server");
访问我上面当前活动的名称。
这是否可行,或者我是否只能使用getter和setter来更改应用程序类中的全局变量。
堆栈追踪:
java.lang.RuntimeException: Unable to start activity ComponentInfo{escar.beedge/escar.beedge.HomeScreen}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
at android.app.ActivityThread.access$2100(ActivityThread.java:116)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4203)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(375): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.view.ViewRoot.setView(ViewRoot.java:460)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.app.Dialog.show(Dialog.java:238)
at escar.beedge.EscarApplication.showError(EscarApplication.java:98)
at escar.beedge.HomeScreen.onCreate(HomeScreen.java:30)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
对话框在应用程序类中声明为:
AlertDialog alertDialog;
在同一个类中创建:
alertDialog = new AlertDialog.Builder(this).create();
以及在该类中调用它的方法如下:
public void showError(String title, String message) {
alertDialog.setTitle(title);
alertDialog.setMessage(message);
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
return;
}
});
alertDialog.show();
}
最后,从这样的活动中调用它:
EscarApplication application;
application = (EscarApplication) this.getApplication();
application.showError("test", "display this message");
答案 0 :(得分:1)
如果您需要在活动之间维护状态,请使用服务。其他任何东西都是黑客
答案 1 :(得分:0)
如果我错了,有人会纠正我,但是Application类将无法执行与视图相关的对象,因为它们需要绑定到需要绑定到活动的视图。
从这个意义上讲,您可以使用Application类来实现自定义对话框的静态方法
public static void setDialog(String title, String message,AlertDialog alertDialog){
alertDialog.setTitle(title);
alertDialog.setMessage(message);
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
return;
}
});
}
但是您必须创建对话框并在活动本身上调用show
方法(实际上甚至可能需要在对话框中创建要在对话框中设置的按钮)活性)
另一种选择可能是实现一个extends
AlertDialog 类的类,其按钮预先设置为您想要的行为。
答案 2 :(得分:-1)
您可以使用Singleton模式。
答案 3 :(得分:-1)
我正在寻找与你类似的东西。
我还没有找到正式答案,但看起来您不应该使用Toast和Dialogs的应用程序上下文。相反,尝试使用活动的上下文,如下所示:
// From inside your activity
Dialog dialog = new Dialog(this);
而不是:
// From inside your Application instance
Dialog dialog = new Dialog(getApplicationContext());
阅读本文: Android: ProgressDialog.show() crashes with getApplicationContext