SharedPreferences值在新实例后返回null

时间:2016-07-15 17:06:13

标签: android android-sharedpreferences

我通过SettingsHelper类在SharedPreferences中设置一个字符串,如下所示。我已经确认它实际上是通过在设置之后获取字符串来设置的。

创建了SettingsHelper类的新实例。

然后我尝试检索我设置的字符串,但它出现null。

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

4 个答案:

答案 0 :(得分:2)

尝试将方法转换为静态方法:

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

请注意!

扩展应用程序对于像这样的类来说不是一个好主意。删除' extends应用程序'。

  

有什么关系?

扩展活动的类是针对必须在整个时间内保持运行且在正常情况下初始化的任务(类c =新类)

通过编写android:name=".MyClass",通过清单初始化扩展应用程序的类。这些类用于:

  • 初始化和处理Firebase
  • 初始化和处理ACRA
  • 初始化和处理权限等重要事项(如果您想在启动时立即检查

因此,扩展应用程序的类不适用于普通类,我建议您按照上面的操作进行操作。另外,因为你多次创建它我认为Context = null

我编辑了上面的代码,复制并再试一次,看看它是否有效

答案 1 :(得分:1)

你正在扩展应用程序类 - 它是错的(或者,至少 - 你可能以错误的方式做它。

如果要扩展Application类,还必须在清单中将其声明为Application。然后 - 您不应该使用新的SettingsHelper()创建它,因为您每次都要创建新的上下文,所以可能 - 您每次都要创建新的首选项文件。另一方面 - 从不调用此类的onCreate()方法,因为它不是由系统管理的。

我认为更好的方法是将这个帮助器切换到Object子类,并在构造函数中传递上下文。

答案 2 :(得分:0)

确保使用此代码启动活动A

SettingsHelper settingsHelper = new SettingsHelper();
settingsHelper.setName("John");

然后从活动A,转到活动B,呼叫:

SettingsHelper settingsHelper = new SettingsHelper();
   String stringHandler = settingsHelper.GetName();

答案 3 :(得分:0)

我的问题变得无关紧要。我正在使用" =="与获取密钥相关的代码而不是.equals()

if(name == "name"){
System.out.print(true);
}
else{
System.out.print(false);
}

应该使用.equals()而不是" =="字符串