У меня странная проблема с компонентом 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.
Я не могу придумать причину, по которой содержимое строк может привести к такому разрушению элемента. Любая помощь будет чрезвычайно признательна.
Спасибо!