Android 自定义首选项未在SharedReferences中存储值?
我编写了一个自定义的Android 自定义首选项未在SharedReferences中存储值?,android,sharedpreferences,Android,Sharedpreferences,我编写了一个自定义的对话框preference,其中包含两个numberpicker。在“onDialogClose”中,我希望将每个值组合起来,然后使用“persistLong”将其存储在SharedReferences中 首选项工作正常,所有内容都按预期调用,但当我尝试从SharedReferences检索值时,似乎没有使用我提供的键存储任何内容 知道哪里可能有问题吗?您可能没有提供正确的上下文,即您检索共享引用的位置可能使用与存储新首选项的位置不同的上下文 更简单的方法是在整个应用程序中使
对话框preference
,其中包含两个numberpicker
。在“onDialogClose”
中,我希望将每个值组合起来,然后使用“persistLong”将其存储在SharedReferences
中
首选项工作正常,所有内容都按预期调用,但当我尝试从SharedReferences
检索值时,似乎没有使用我提供的键存储任何内容
知道哪里可能有问题吗?您可能没有提供正确的
上下文
,即您检索共享引用的位置
可能使用与存储新首选项的位置不同的上下文
更简单的方法是在整个应用程序中使用一个PreferenceHelper
类来检索和存储值
package in.example;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
public class PreferencesHelper {
private SharedPreferences prefs;
private SharedPreferences.Editor editor;
// Class constants.
public PreferencesHelper(Context context) {
prefs = PreferenceManager.getDefaultSharedPreferences(context);
editor = prefs.edit();
}
public static PreferencesHelper getInstance(Context context) {
return new PreferencesHelper(context);
}
public Boolean getBoolean(String key) {
return prefs.getBoolean(key, false);
}
public void setBoolean(String key, Boolean value) {
editor.putBoolean(key, value);
editor.commit();
}
public String getString(String key) {
return prefs.getString(key, "");
}
public void setString(String key, String value) {
editor.putString(key, value);
editor.commit();
}
public int getInt(String key) {
return prefs.getInt(key, 0);
}
public void setInt(String key, int value) {
editor.putInt(key, value);
editor.commit();
}
}
现在,您可以通过调用PreferencesHelper.getInstance(context)
轻松获取此类的实例,然后只需调用其方法来存储或检索值
注意。上面的示例类返回一个空字符串,对于
如果未为设置或找到任何值,则布尔值和0表示int值
给定的首选项
对SharedReferences上下文使用
context.getApplicationContext()
怎么样?发布一些代码。尤其是读取和存储数据,问题似乎在于两种不同的上下文!非常感谢你!确切地说,GetDefaultSharedReferences在进程内返回一个单例-在进程内传递它的任何上下文都无关紧要。请参阅:对于我的包装器,也可以使用-makeprefs和editorfinal。这将使您的类线程安全。并且让一些行切断调用链,比如editor.putInt(key,value.commit()代码>。最后,因为您提供了一个工厂,所以cstor是私有的——尽管您可以将类设置为“静态的”maybe@Mr_and_Mrs_D真的非常感谢,这些都是你刚刚介绍给我的非常好的经验:)@Mr_和Mrs_D我也会在未来的节目和包装中记住这些