让我说我用字符串Top
保存位置设置。
在更改应用程序语言时,该字符串变得毫无意义,因为在新语言中它将是Arriba
,例如,那些字符串不相等。
所以我必须存储位置值1
,因为它在各种语言中都是相同的。
但是,首选项的摘要变为1
,而不是以其他语言翻译成“Top”的任何方式。
所以我将代码映射到位置文本1
- > Top
仅用于汇总显示,并保留位置代码。
我仍然需要在向用户显示设置的任何地方来回翻译(如果有的话),同时使用每种语言的每个首选项的代码和映射本身维护数组。
好处是我可以通过代码使用并将设置应用到应用程序,而无需事先将其从名称映射回来,以及应用程序在显示首选项时将代码转换为字符串的事实(使用“来自”的代码)设置活动“为此。”
所以我想知道,你是如何管理它的,这样它就不会变得难以管理或者回来咬你的路?
答案 0 :(得分:0)
我认为你应该从对面看到问题。现在你专注于通过它的值来存储偏好,但是让我们从定义代表设置的所有可能值的类型开始,例如:
enum Position
{
TOP("position_top"),
BOTTOM("position_bottom"),
LEFT("position_left")
;
public final String identifier;
private Position(String identifier) { this->identifier = identifier; }
}
现在您拥有该设置的所有可能值,并且您关联了一个标识符(如果您愿意,可以直接使用枚举toString()
值。)
此标识符既可用于首选项中的序列化,也可用于引用strings.xml
中的本地化资源。
答案 1 :(得分:0)
由于要按照documentation来避免枚举,这就是我所做的:
定义了两个数组;一个用于语言字符串,另一个用于arrays.xml
<string-array name="lang">
<item>Inglés</item>
<item>Español</item>
</string-array>
<string-array name="langCode">
<item>EN</item>
<item>ES</item>
</string-array>
在代码中,我将两个字符串数组加载到数组中,并比较代码以获取key
的语言:
public void onSharedPreferenceChanged(SharedPreferences sp, String key) {
Preference preference = findPreference(key);
String arrayLang[] = getResources().getStringArray(R.array.lang);
String arrayCode[] = getResources().getStringArray(R.array.langCode);
for (int i = 0; i < arrayCode.length; i++) {
if (arrayCode[i].contains(key)) {
preference.setSummary(arrayLang[i]);
}
}
所以现在我将langCode
数组保留在每种语言中,只翻译名称。
可能不是最好的方式,但它可以胜任。