在Android ListPreference中具有默认值的问题

问题描述 投票:0回答:1

我是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以选择用户是否...

android xml android-fragments android-preferences android-settings
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.