danilochagov
@danilochagov

Почему сбрасывает выделенное состояние ListPreference?

Привет, у меня есть активити настроек(preferences.xml)
5bf3fc2d7e316812070687.png
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory android:title="@string/main_preference">
        <CheckBoxPreference
            android:defaultValue="true"
            android:key="sounds_pref"
            android:title="@string/sounds_preference" />
        <ListPreference
            android:entries="@array/font_size_list_description"
            android:entryValues="@array/font_size_list_description"
            android:key="font_size_description_pref"
            android:summary="@string/font_size_preference_description"
            android:title="@string/font_size_preference" />
        <ListPreference
            android:entries="@array/font_style_list_description"
            android:entryValues="@array/font_style_list_description"
            android:key="font_style_description_pref"
            android:summary="@string/font_style_preference_description"
            android:title="@string/font_style_preference" />
        <ListPreference
            android:title="@string/language_preference"
            android:summary="@string/lang_preference_description"
            android:key="lang_pref"
            android:entries="@array/lang"
            android:entryValues="@array/lang" />
    </PreferenceCategory>

SettingsActivity.java
public class SettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getFragmentManager().beginTransaction().replace(android.R.id.content, new PreferencesFragment()).commit();

        PreferenceManager.setDefaultValues(SettingsActivity.this, R.xml.preferences, false);
    }

    public static class PreferencesFragment extends PreferenceFragment {
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);

            /*       -----------set default value--------------      */
            // font-size
            ListPreference listPreference = (ListPreference) findPreference("font_size_description_pref");
            if (listPreference.getValue() == null) listPreference.setValueIndex(4);

            // font-style
            ListPreference listPreference2 = (ListPreference) findPreference("font_style_description_pref");
            if (listPreference2.getValue() == null) listPreference2.setValueIndex(1);

            // sex of a person
            ListPreference listPreference3 = (ListPreference) findPreference("sex_pref");
            if (listPreference3.getValue() == null) listPreference3.setValueIndex(0);

            // language
            ListPreference listPreference4 = (ListPreference) findPreference("lang_pref");
            if (listPreference4.getValue() == null) listPreference4.setValueIndex(0);
        }
    }
}

И там есть функция смены языка. Когда приложение стоит на англ(дефолтном) языке, то все значения отмечаются кружочком в ListPreferences, но когда я меняю язык на русский, то всё слетает, и приходиться самому ставить значения, при обратном возвращении на англ язык, всё работает нормально. Заметил, что настройка размера шрифта и смена языка остаётся работать как надо(мб то, что во всех файлах на одном языке написаны строки)

strings-en.xml
<string-array name="font_size_list_description">
        <item>12sp</item>
        <item>13sp</item>
        <item>14sp</item>
        <item>15sp</item>
        <item>16sp</item>
        <item>17sp</item>
        <item>18sp</item>
    </string-array>

    <string-array name="font_style_list_description">
        <item>italic</item>
        <item>normal</item>
        <item>bold</item>
        <item>bold + italic</item>
    </string-array>

    <string-array name="sex">
        <item>male</item>
        <item>female</item>
    </string-array>

    <string-array name="lang">
        <item>English(en)</item>
        <item>Русский(ru)</item>
    </string-array>

strings-ru.xml
<string-array name="font_size_list_description">
        <item>12sp</item>
        <item>13sp</item>
        <item>14sp</item>
        <item>15sp</item>
        <item>16sp</item>
        <item>17sp</item>
        <item>18sp</item>
    </string-array>

    <string-array name="font_style_list_description">
        <item>курсивный</item>
        <item>обычный</item>
        <item>жирный</item>
        <item>жирный + курсивный</item>
    </string-array>

    <string-array name="sex">
        <item>мужской</item>
        <item>женский</item>
    </string-array>

    <string-array name="lang">
        <item>English(en)</item>
        <item>Русский(ru)</item>
    </string-array>

MainActivity.java
private SharedPreferences sharedPreferences;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
        setLanguage();

        setContentView(R.layout.activity_main);
   }
    private void setLanguage() {
        String lang_code = "en";

        switch (sharedPreferences.getString("lang_pref", "English(en)")) {
            case "English(en)":
                lang_code = "en";
                break;

            case "Русский(ru)":
                lang_code = "ru";
        }

        Resources res = getResources();
        DisplayMetrics displayMetrics = res.getDisplayMetrics();
        Configuration configuration = res.getConfiguration();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(new Locale(lang_code.toLowerCase()));
        } else {
            configuration.locale = new Locale(lang_code.toLowerCase());
        }

        res.updateConfiguration(configuration, displayMetrics);
    }

В чём проблема? И стоит ли делать чтобы изначально значения отображались выделенными?
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
KuSu
@KuSu
Android разработчик

android:entries="@array/font_style_list_description"
android:entryValues="@array/font_style_list_description"


В первое ты вставляешь строки которые зависят от языка и отображаются пользователям, а во второе - то, что будет едино для всех языков. Иначе при переключении на русский оно ищет, например, значение "normal" среди entryValues, не находит и выбирает первое
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы