更新语言更改的 ListPreference 摘要
Update ListPreference summary on language change
当在我的 ListPreference
中选择了一种新语言时,我更改它并重新加载我的 Fragment
以便应用它,如下所示:
listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Get selected language
String selectedLanguage = newValue.toString();
preference.setSummary(selectedLanguage);
// Change language
Locale locale;
if (selectedLanguage.equals("French")) {
locale = new Locale("fr");
} else {
locale = new Locale("en");
}
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getActivity().getApplicationContext().getResources().updateConfiguration(config, null);
// Refresh fragment
getFragmentManager().beginTransaction()
.replace(R.id.content_frame, new SettingsFragment())
.commit();
return true;
}
});
例如,如果选择法语,它会将法语应用到我的所有字符串(在 strings-fr.xml
文件中定义),但它不会对我的 ListPreference
s 摘要应用(即使他们在正确的文件中有他们的翻译)。
两个问题:
是否有更好的方法来加载我的语言而不是重新加载我的Fragment
?
我如何将我的 ListPreference
摘要更新为正确的语言?
Is there a better way to load my language instead of reloading my
Fragment?
我认为这是立即加载新语言的最佳方式。它可能不会在 Activity
/Application
重新启动后继续。在这种情况下,您需要从 SharedPreferences
检查语言并将其加载到 Activity
/Application
onCreate()
:
private Locale locale = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
final Configuration config = getBaseContext().getResources().getConfiguration();
final String language = PreferenceManager.getDefaultSharedPreferences(this).getString("language", "");
if (!TextUtils.isEmpty(language) && !config.locale.getLanguage().equals(language))
{
locale = new Locale(language);
setLocale(config);
}
setContentView(R.layout.main_activity);
...
}
And how may I update my ListPreferences summary to the right language?
您的问题缺少 XML 个文件,但这是我通常这样做的方式,每次对我来说都很好,我不需要以编程方式更新摘要:
preferences.xml
<ListPreference
android:defaultValue="en"
android:entries="@array/language_names"
android:entryValues="@array/language_values"
android:icon="@drawable/ic_language"
android:key="language"
android:summary="@string/current_language"
android:title="@string/language_title"/>
strings.xml
<string-array name="language_names">
<item>English</item>
<item>French</item>
</string-array>
<string-array name="language_values">
<item>en</item>
<item>fr</item>
</string-array>
<string name="current_language">English</string>
strings-fr.xml
<string-array name="language_names">
<item>Anglais</item>
<item>Français</item>
</string-array>
<string name="current_language">Français</string>
当在我的 ListPreference
中选择了一种新语言时,我更改它并重新加载我的 Fragment
以便应用它,如下所示:
listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Get selected language
String selectedLanguage = newValue.toString();
preference.setSummary(selectedLanguage);
// Change language
Locale locale;
if (selectedLanguage.equals("French")) {
locale = new Locale("fr");
} else {
locale = new Locale("en");
}
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getActivity().getApplicationContext().getResources().updateConfiguration(config, null);
// Refresh fragment
getFragmentManager().beginTransaction()
.replace(R.id.content_frame, new SettingsFragment())
.commit();
return true;
}
});
例如,如果选择法语,它会将法语应用到我的所有字符串(在 strings-fr.xml
文件中定义),但它不会对我的 ListPreference
s 摘要应用(即使他们在正确的文件中有他们的翻译)。
两个问题:
是否有更好的方法来加载我的语言而不是重新加载我的
Fragment
?我如何将我的
ListPreference
摘要更新为正确的语言?
Is there a better way to load my language instead of reloading my Fragment?
我认为这是立即加载新语言的最佳方式。它可能不会在 Activity
/Application
重新启动后继续。在这种情况下,您需要从 SharedPreferences
检查语言并将其加载到 Activity
/Application
onCreate()
:
private Locale locale = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
final Configuration config = getBaseContext().getResources().getConfiguration();
final String language = PreferenceManager.getDefaultSharedPreferences(this).getString("language", "");
if (!TextUtils.isEmpty(language) && !config.locale.getLanguage().equals(language))
{
locale = new Locale(language);
setLocale(config);
}
setContentView(R.layout.main_activity);
...
}
And how may I update my ListPreferences summary to the right language?
您的问题缺少 XML 个文件,但这是我通常这样做的方式,每次对我来说都很好,我不需要以编程方式更新摘要:
preferences.xml
<ListPreference
android:defaultValue="en"
android:entries="@array/language_names"
android:entryValues="@array/language_values"
android:icon="@drawable/ic_language"
android:key="language"
android:summary="@string/current_language"
android:title="@string/language_title"/>
strings.xml
<string-array name="language_names">
<item>English</item>
<item>French</item>
</string-array>
<string-array name="language_values">
<item>en</item>
<item>fr</item>
</string-array>
<string name="current_language">English</string>
strings-fr.xml
<string-array name="language_names">
<item>Anglais</item>
<item>Français</item>
</string-array>
<string name="current_language">Français</string>