如果Android偏好设置中的首选项类型发生了变化,该怎么办?例如,如果Boolean
更改为ListPreference
?
Google真的没有想过Preference Migrations吗?
现在唯一合理的方式似乎是版本首选项和标记删除首选项随给定版本而变化..?
答案 0 :(得分:1)
尝试使用新数据类型读取密钥,如果SharedPreferences prefs;
String key = "key";
prefs = PreferenceManager.getDefaultSharedPreferences(this);
if (prefs.contains(key)) {
// key exists, so tetermine it's type
try {
prefs.edit().get<old_type_name>(key, <default_old_type_value>);
} catch (Exceprtion e) {
if (e instanceOf ClassCastException) {
prefs.edit().remove(key).apply();
}
}
}
// we are here if no key exists or key removed
prefs.edit().put<new_type_name>(key, <new_type_value>).apply();
异常删除“旧”密钥,并创建具有相同名称但新类型的新密钥。像这样:
if (prefs.contains(key)) ...
如果需要,请在首次启动时检查public static void main(String[] args)
{
String s = new String("xlactz3Ja8Z/qep6niE=");
System.out.println("String: " + s);
byte[] b = Base64.getDecoder().decode(s);
String res = "";
String aux = new String();
for(byte a : b)
{
aux = Integer.toBinaryString(255 & a);
// If length is less than 8, than add "0"
if (aux.length() != 8) {
aux = padronize (aux);
}
res = res + aux + " ";
}
// Padronize all Substrings to have length 8
private static String padronize (String str) {
String aux = "";
// Create a auxiliar string to padronize
for (int i = 0; i < 8 - str.length(); i++) {
aux += "0";
}
return aux + str;
}
一次。
答案 1 :(得分:0)
我做了一些适用于原始SharedPreferences并且不需要PreferenceFragment的东西:
这为我提供了一种很好的设置迁移方式,完全基于字符串xml资源而且没有代码更改,如果用户没有经常更新应用程序,它还应该逐步迁移所有后续版本: - )
最近为最近更改的用户评论标记最近的迁移也很好。