Проблемы со значениями по умолчанию в android ListPreference - PullRequest
0 голосов
/ 03 апреля 2020

У меня странная проблема с компонентом ListPreference Android. Я пытаюсь сделать игру ti c -ta c -eee для курса Android, и пытаюсь добавить ListPreference, чтобы выбрать, хочет ли пользователь играть с "X" или "O". Я получаю странное поведение при попытке установить значение по умолчанию. Сначала я предоставлю свой код, который работает:

res/xml/preferences.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen
        xmlns:app="http://schemas.android.com/apk/res-auto">

        <PreferenceCategory
            app:title="@string/preferences_category_game_settings_title" >

            <ListPreference
                app:title="@string/preferences_your_piece_title"
                app:defaultValue="x"
                app:useSimpleSummaryProvider="true"
                app:key="your_piece"
                app:entries="@array/preferences_your_piece_list"
                app:entryValues="@array/preferences_your_piece_stored" />

        </PreferenceCategory>

    </PreferenceScreen>

res/values/arrays.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="preferences_your_piece_list">
        <item>@string/preferences_your_piece_x</item>
        <item>@string/preferences_your_piece_o</item>
    </array>

    <array name="preferences_your_piece_stored">
        <item>x</item>
        <item>o</item>
    </array>
</resources>

res/values/strings.xml:

<resources>
    <string name="preferences_category_game_settings_title">Game Settings</string>
    <string name="preferences_your_piece_title">Your Game Piece</string>
    <string name="preferences_your_piece_x">X</string>
    <string name="preferences_your_piece_o">O</string>
</resources>

По какой-то причине эта настройка очень Fr agile. Если я внесу какие-либо изменения в строки, хранящиеся в entryValues, значение по умолчанию больше не будет работать. Значение в приложении показывает «Unset». Например, если я просто прописываю буквы сохраненных значений, они ломаются.

res/xml/preferences:

...
<ListPreference
    app:title="@string/preferences_your_piece_title"
    app:defaultValue="X"
...

res/values/arrays.xml:

...
<array name="preferences_your_piece_stored">
    <item>X</item>
    <item>O</item>
</array>
...

Капитализация это всего лишь один простой пример. Если я изменю значения на ЛЮБУЮ другую строку, отличную от 'x' и 'o', она сломается. Я также попытался переместить entryValues в файл строк, как показано ниже.

res/values/strings.xml:

...
    <string name="preferences_your_piece_x_value">x</string>
    <string name="preferences_your_piece_o_value">o</string>
...

res/values/arrays.xml:

...
    <array name="preferences_your_piece_stored">
        <item>@string/preferences_your_piece_x_value</item>
        <item>@string/preferences_your_piece_o_value</item>
    </array>
...

res/xml/preferences.xml:

...
        <ListPreference
            app:title="@string/preferences_your_piece_title"
            app:defaultValue="@string/preferences_your_piece_x_value"
...

Эта реализация работает, как показано, но как только я изменяю строки на НИЧЕГО, кроме 'x' и 'o', она прерывается.

В код, который я предоставил здесь, я показываю только одно предпочтение. В моем реальном приложении у меня их несколько. Странная вещь: когда я изменяю entryValues строки этого предпочтения, он нарушает значения по умолчанию ВСЕХ предпочтений.

Насколько мой внутренний код идет:

Это мой класс фрагмента:

class PreferencesFragment : PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
}

Вот как я открываю экран настроек с помощью пункта меню:

        val fragment = PreferencesFragment()
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.fragment_container, fragment)
            .addToBackStack(null)
            .commit()

Я НЕ получил доступ к общим настройкам с помощью sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)

С точки зрения процесса сборки я полностью удаляю приложение с телефона, прежде чем перезапустить его из Android Studio с изменениями. Я попытался запустить Clean Project, а также Rebuild Project в Android Studio.

Я не могу придумать причину, по которой содержимое строк может привести к такому разрушению элемента. Любая помощь будет чрезвычайно признательна.

Спасибо!

...