我正在通过settingshelper类在sharedpreferences中设置一个字符串,如下所示。我已经通过在字符串设置之后立即获取字符串来验证它是否已设置。
将创建SettingShelper类的新实例。
然后我尝试检索我设置的字符串,但结果为空。
getname可能返回null,因为我创建了settingshelper类的新实例?
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();
}
}
活动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();
}
}
(从活动中)呼叫。如果是外部活动,请将其替换为上下文:
getName(this);
setName("Namey McNameface", this);
这样就不需要实例,只需要调用settingshelper.setname/getname。
编辑
记住给一个字符串赋值:
SettingsHelper settingsHelper = new SettingsHelper();
String stringHandler = settingsHelper.GetName();
//handle string
编辑2
注意!
对于这样的类,扩展应用程序不是一个好主意。删除“扩展应用程序”。
有什么关系?
类扩展活动用于必须始终运行且未以正常方式初始化的任务(类C=新类)
通过编写
android:name=".MyClass"
,通过清单初始化扩展应用程序的类。这些类用于:初始化和处理firebase
初始化和处理acra
初始化和处理诸如权限之类的重要事情(如果您想在启动时立即检查它们
因此,扩展应用程序的类不适用于普通类,我建议您像我上面所做的那样。另外,因为您多次创建它,所以我认为context=null也是
我编辑了上面的代码,复制后再试一次,看看是否有效