我不喜欢Android SharedPreferences
类的工作方式。
我的主要原因是,每次在应用程序的任何部分查找键值对时,都必须指定默认值。鉴于大多数应用程序可能会在多个位置调用这些值,这种方法实际上会促进预期的应用程序/首选项行为中的错误,因为没有中心点来获取默认设置。示例:活动A getBoolean(key133,false),Actvity B getBoolean(key133,true):问题。
我通过在HashMap
中指定/存储我所需的应用程序首选项值来规避此问题,并且我有一个自定义SharedPreferences
派生类,它懒惰地查找指定{{1}中的默认值}秒。我只是调用一个MyClass.getBoolean(key)或一个MyClass.getString(key),它会查找HashMap
中的默认值,返回并存储(.commit() - )如果它没有还没存在。默认行为是调用HashMap
。这也有利于性能,因为在应用程序初始化时存储所有首选项的性能非常差。
一个问题解决了,但现在我有一个新的问题:所有getBoolean(key, default_value)
派生类都找不到默认值,因为我不能使用我自己的Preference
派生方式来查询默认应用程序设置这导致我的应用程序正常工作,但我的设置实际上并没有显示默认值,因为它们在首次打开设置页面时并未(始终)存储...
长话短说:如何覆盖SharedPreference
类来阻止这种情况?
编辑:一些代码来解释问题以及我选择这种方式的原因
Preference
这有效:
private final static Context context = ApplicationSubclass.getApplicationContext_();
private final static SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
private final static SharedPreferences.Editor editor = prefs.edit();
public static Map<String, Boolean> booleans = new HashMap<String, Boolean>();
public static Map<String, Integer> longs = new HashMap<String, Integer>();
public static Map<String, String> strings = new HashMap<String, String>();
public static Map<String, Integer> integers = new HashMap<String, Integer>();
public aPreferences(){
initialise();
}//end constructor
public void initialise(){
// setup default preferences
setBooleans();
//setLongs();
setStrings();
//setIntegers();
}//end method
private void setBooleans(){
booleans.put("does_this_work", true);
booleans.put("is_it_easy", true);
booleans.put("is_it_free_of_problems", false);
// and some hundreds more
}//end method
private void setStrings(){
strings.put("show_me", "Show me!");
// and some hundreds more
}//end method
// work the magic here
public boolean getBoolean(String key){
if (!prefs.contains(key)) putBoolean(key, booleans.get(key));
return prefs.getBoolean(key, booleans.get(key));
}//end method
public void putBoolean(String key, boolean value){
editor.putBoolean(key, value).commit();
}//end method
这不是:
private static aPreferences values = new aPreferences();
if (values.getBoolean("does_this_work")) // value initialised upon first access
Log.d(getClass().getSimpleName(), values.getString("show_me"));
答案 0 :(得分:0)
我实际上建议您创建自己的首选项管理类来处理这样的事情。如果需要知道默认值是什么,可以设置自己的全局get / set方法并将默认值公开为公共静态字段。像这样:
public class MyPreferences {
private static final String INT_VALUE_1_KEY = "VALUE_1";
public static final int INT_VALUE_1_DEFAULT = -1;
public static void setDefaults(Context c) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
Editor edit = prefs.edit();
if (!prefs.contains(INT_VALUE_1_KEY)) {
edit.putInt(INT_VALUE_1_KEY, INT_VALUE_1_DEFAULT);
}
// etc..
edit.commit();
}
public static int getValue1(Context c) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
return prefs.getInt(INT_VALUE_1_KEY, INT_VALUE_1_DEFAULT);
}
}