我通过我的 SettingsHelper 类在 SharedPreferences 中设置一个字符串,如下所示。我已经通过在设置后立即获取字符串来验证它实际上已设置。
已创建 SettingsHelper 类的新实例。
然后我尝试检索我设置的字符串,但它显示为空。
getName 是否会因为我创建了 SettingsHelper 类的新实例而返回 null?
public class SettingsHelper extends Application {
private static Context context;
Context ctx;
public void onCreate() {
super.onCreate();
context = getApplicationContext();
ctx = context;
}
public static Context getAppContext() {
return context;
}
public SettingsHelper() {
this.ctx = context;
}
public String getName() {
return PreferenceManager.getDefaultSharedPreferences(ctx).getString("myKey", "null");
}
public void setName(String name) {
PreferenceManager.getDefaultSharedPreferences(ctx).edit().putString("myKey", name).commit();
}
}
Activity A
SettingsHelper settingsHelper = new SettingsHelper();
settingsHelper.setName("John");
B 级
SettingsHelper settingsHelper = new SettingsHelper();
settingsHelper.getName(); //null
最佳答案
尝试将方法转换为静态方法:
public class SettingsHelper {
public static String getName(Context ctx) {
return PreferenceManager.getDefaultSharedPreferences(ctx).getString("myKey", "An error occured loading name");
}
public static void setName(String name, Context ctx) {
PreferenceManager.getDefaultSharedPreferences(ctx).edit().putString("myKey", name).commit();
}
}
用于调用(从 Activity )。如果它是外部 Activity ,则将其替换为上下文:
getName(this);
setName("Namey McNameface", this);
这样你就不需要实例,只需调用SettingsHelper.setName/getName即可。
编辑
记住分配一个字符串:
SettingsHelper settingsHelper = new SettingsHelper();
String stringHandler = settingsHelper.GetName();
//handle string
编辑#2
注意!
对于像这样的类来说,扩展应用程序并不是一个好主意。删除“扩展应用程序”。
What does it matter?
扩展 Activity 的类适用于必须始终运行的任务,并且它们不以正常方式初始化(Class c = new Class)
扩展应用程序的类通过编写 android:name=".MyClass"
通过 list 进行初始化。这些类用于:
- 初始化和处理 Firebase
- 初始化和处理 ACRA
- 初始化并处理权限等重要事项(如果您想在启动时立即检查它们
因此,扩展应用程序的类不适用于普通类,我建议您按照我上面的做法进行操作。此外,因为您多次创建它,所以我认为 Context = null 也是如此
我编辑了上面的代码,复制并重试,看看是否有效
关于android - SharedPreferences 值在新实例后返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38401642/