Обновление ListPreference сводки по смене языка

Когда новый язык выбран в моем 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с резюме (даже если у них есть перевод в нужных файлах).

Два вопроса:

  • Есть ли лучший способ загрузить мой язык вместо перезагрузки моего Fragment?

  • И как я могу обновить мой ListPreferenceс резюме на правильный язык?

1 ответ

Решение

Есть ли лучший способ загрузить мой язык вместо перезагрузки моего фрагмента?

Я думаю, что это был бы лучший способ для немедленной загрузки нового языка. Это не может продолжаться после Activity/Application перезагрузите хотя. В этом случае вам нужно будет проверить язык с SharedPreferences и загрузить его в Activity/ApplicationonCreate():

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);
    ...
}

И как я могу обновить свое резюме ListPreferences на нужный язык?

В вашем вопросе отсутствуют 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>

Строки-fr.xml

<string-array name="language_names">
    <item>Anglais</item>
    <item>Français</item>
</string-array>
<string name="current_language">Français</string>
Другие вопросы по тегам