android - SharedPreferences 值在新实例后返回 null

标签 android android-sharedpreferences

我通过我的 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/

相关文章:

android - 从另一个 Activity 接收共享 SharedPreferences 值的值

java - 尝试在空对象引用上调用接口(interface)方法sharedPreferences.edit()'

android - 共享首选项在应用程序被终止时不保存 StringSet(这是一个功能)

android - 使用 SharedPreferences 显示字符串不起作用

android - 当我将 MediaQuery.of(context).padding.top 与 appBar 一起使用时,它返回 0.0。这是为什么?

javascript - Android HTML5 FileApi 可以从 SD 卡读取文件吗?

android - 在 ListFragment 中添加HeaderView 的最佳位置

java - SharedPreferences 没有更新其值

android - 使用华为应用服务依赖项时在 Android 12 上崩溃,使用构建工具 31

android - React Native PermissionsAndroid 始终返回 "never_ask_again"以获取 Android 上的位置