Android 列表偏好
Android ListPreference
我正在为游戏实施 运行 时间语言更改。
在首选项中保存数据。
一切正常,除了一件事:
在首选项中,我在 ListPreference 中指定了语言。
如果我改变语言 - 在应用程序的任何地方都改变得很好,
但如果我再次尝试更改语言,ListPreference 中的指针始终为英语(默认值)而不是当前语言。
再次:
默认值为英语。我把它改成法语。
我的应用程序语言变成了法语,
但是当我现在输入 ListPreference - 指针仍然在英文上(就像英文是当前的一样),
但必须是法语。
这是我的代码:
preferences.xml
PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory
<ListPreference
android:key="language"
android:title="@string/language"
android:summary="@string/select_language"
android:defaultValue="en"
android:entries="@array/languages"
android:entryValues="@array/languagesValues"
/>
</PreferenceScreen>
数组 .xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="languages">
<item name="english">English</item>
<item name="french">French</item>
</string-array>
<string-array name="languagesValues">
<item name="english">en</item>
<item name="french">fr</item>
</string-array>
</resources>
偏好活动
public class Settings extends PreferenceActivity {
Locale myLocale;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
Preference langPreference = getPreferenceScreen().findPreference(
"language");
langPreference.setOnPreferenceChangeListener(languageChangeListener);
}
Preference.OnPreferenceChangeListener languageChangeListener = new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
switch (newValue.toString()) {
case "en":
setLocale("en");
Toast.makeText(getApplicationContext(), "Locale in English!", Toast.LENGTH_LONG).show();
break;
case "fr":
setLocale("fr");
Toast.makeText(getApplicationContext(), "Locale in French!", Toast.LENGTH_LONG).show();
break;
}
return false;
}
};
//* manually changing current locale/
public void setLocale(String lang) {
myLocale = new Locale(lang);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
Intent refresh = new Intent(this, Settings.class);
finish();
startActivity(refresh);
}
}
您将返回 false
而不是 true
。
onPreferenceChange
文档:returns "True to update the state of the Preference with the new value."
因为您返回的是 false,所以您没有更新 Preference
的状态。
我正在为游戏实施 运行 时间语言更改。 在首选项中保存数据。 一切正常,除了一件事:
在首选项中,我在 ListPreference 中指定了语言。 如果我改变语言 - 在应用程序的任何地方都改变得很好, 但如果我再次尝试更改语言,ListPreference 中的指针始终为英语(默认值)而不是当前语言。 再次: 默认值为英语。我把它改成法语。 我的应用程序语言变成了法语, 但是当我现在输入 ListPreference - 指针仍然在英文上(就像英文是当前的一样), 但必须是法语。
这是我的代码:
preferences.xml
PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory
<ListPreference
android:key="language"
android:title="@string/language"
android:summary="@string/select_language"
android:defaultValue="en"
android:entries="@array/languages"
android:entryValues="@array/languagesValues"
/>
</PreferenceScreen>
数组 .xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="languages">
<item name="english">English</item>
<item name="french">French</item>
</string-array>
<string-array name="languagesValues">
<item name="english">en</item>
<item name="french">fr</item>
</string-array>
</resources>
偏好活动
public class Settings extends PreferenceActivity {
Locale myLocale;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
Preference langPreference = getPreferenceScreen().findPreference(
"language");
langPreference.setOnPreferenceChangeListener(languageChangeListener);
}
Preference.OnPreferenceChangeListener languageChangeListener = new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
switch (newValue.toString()) {
case "en":
setLocale("en");
Toast.makeText(getApplicationContext(), "Locale in English!", Toast.LENGTH_LONG).show();
break;
case "fr":
setLocale("fr");
Toast.makeText(getApplicationContext(), "Locale in French!", Toast.LENGTH_LONG).show();
break;
}
return false;
}
};
//* manually changing current locale/
public void setLocale(String lang) {
myLocale = new Locale(lang);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
Intent refresh = new Intent(this, Settings.class);
finish();
startActivity(refresh);
}
}
您将返回 false
而不是 true
。
onPreferenceChange
文档:returns "True to update the state of the Preference with the new value."
因为您返回的是 false,所以您没有更新 Preference
的状态。