我是Android的ListPreference组件的一个奇怪问题。我正在尝试为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>
由于某些原因,此设置非常脆弱。如果我对entryValues
中存储的字符串进行了某种更改,则默认值不再起作用。应用程序中的值显示“未设置”。例如,如果我仅将存储值的字母大写,则会中断。
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重新进行更改之前,我已经从手机上完全卸载了该应用。我尝试在Android Studio中运行Clean Project以及Rebuild Project。
我无法提出任何理由,因为字符串的内容会导致元素像这样中断。任何帮助将不胜感激。
谢谢!
我是Android的ListPreference组件的一个奇怪问题。我正在尝试为Android课程制作井字游戏,并试图添加ListPreference以选择用户是否...