2016-07-15 117 views
2

我在SharedPreferences中通过SettingsHelper类设置一个字符串,如下所示。我已经通过在设置后立即获取字符串来验证它实际上已被设置。SharedPreferences值在新实例后返回null

创建了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 
+0

你有没有真的开始活动A? –

+0

是的。我已经验证该名称已在活动A中设置。 – HappyPoofySquirrel

回答

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:如果是外面的活动具有上下文替换此。

编辑

记住ASIGN字符串:

SettingsHelper settingsHelper = new SettingsHelper(); 
String stringHandler = settingsHelper.GetName(); 
//handle string 

编辑#2

注意!

扩展应用程序不是像这样的类的好主意。删除'扩展应用程序'。

这有什么关系?延伸活性

类是对于必须保持运行的整个时间任务和它们在正常FASION(类C =新类)

类扩展应用初始化通过初始化通过编写android:name=".MyClass"表明。这些类用于:

  • 初始化并在启动时处理火力地堡
  • 初始化和处理ACRA
  • 初始化和处理重要的事情一样的权限(如果你觉得检查他们瞬间

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

我编辑上面的代码,然后再试一次,看看它是否工作

+0

可否getName返回null,因为我创建了新实例?我打算静态(最后的手段)或使用依赖注入来解决问题,如果是这样的话。 – HappyPoofySquirrel

+0

我不认为它返回null实例 –

+0

它不应该在理论上,但你可以尝试上面的代码,看看它是否可以解决问题 – Zoe

1

你推广应用类 - 这是错的(或者,至少 - 你正在做它可能在错误的方式。

如果你想扩展Application类,你还必须在清单中声明它为Application。然后 - 当你每次创建新的上下文时,都不应该使用新的SettingsHelper()创建它,所以可能 - 每次都创建新的首选项文件。另一方面,这个类的onCreate()方法永远不会被调用,因为它不是由系统管理的。

在我看来,更好的方法是将此帮助器切换到Object子类,并在构造器中传递上下文。

+0

要试试这个。谢谢 – HappyPoofySquirrel

0

务必从活动开始一个一个的活动与此代码

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

然后,转到活动为B调用此:

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

我的问题变成了无关系。我用 “==” 的相关拿到钥匙,而不是.equals()

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

的代码应该使用.equals()不是 “==” 字符串