我已经实现了一个单例类,以避免将Activity作为参数传递给每个方法/构造函数。
public class ApplicationContext {
private static class Holder {
private static final ApplicationContext INSTANCE = new ApplicationContext();
}
private ApplicationContext() {}
private Context mContext;
public static ApplicationContext getInstance(){
return Holder.INSTANCE;
}
public Context getContext(){
return Holder.INSTANCE.mContext;
}
public void setContext(Context mContext){
Holder.INSTANCE.mContext = mContext;
}
}
在我最初的活动中,我设置了上下文:
private void initializeObjects(){
ApplicationContext.getInstance().setContext(getApplicationContext());
}
当我尝试在ProgressDialog中使用上下文时会出现问题:
@Override
protected void onPreExecute() {
pd = ProgressDialog.show(context, "", "Salvando Usuário");
}
错误讯息:
07-05 20:29:46.413 30930-30930/com.test.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.test.app, PID: 30930
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.view.ViewRootImpl.setView(ViewRootImpl.java:690)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:289)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
at android.app.Dialog.show(Dialog.java:311)
at android.app.ProgressDialog.show(ProgressDialog.java:116)
使用像我这样的单身人士是一个好习惯吗?怎么了?如果不是,那么什么是好的做法而是将上下文/活动传递给每个电话?
提前感谢。
答案 0 :(得分:1)
对于AlertDialogs,您不能使用任何非Activity的上下文,因此如果您在片段中,请使用Activity.this或getActivity()之类的内容。
您仍然可以使用Application全局上下文来获取颜色和drawable以及其他内容,但是例如使用此上下文创建一个视图,主题将被忽略,因此请尽量使用Activity上下文。
顺便说一下,如果你想拥有一个可以访问上下文的单例,你应该在ApplicationContext中扩展Application类并覆盖onCreate方法,同时将这个ApplicationContext类添加到你的清单Application元素名。如果您使用该initializeObjects方法并从第一个活动中调用它,那么退出该活动时该上下文会发生什么?
以此为例:
public class ApplicationContext extends Application {
private Context mContext;
public static Context getContext(){
return mContext;
}
@Override
public void onCreate() {
mContext = this;
// you can initialize other stuff here if you want
}
}
// manifest
<application
android:name="com.example.ApplicationContext"
当应用程序运行时,它总是通过Application类的onCreate方法,它贯穿应用程序的整个生命周期。但不要滥用太多。