获取 ListPreference 选择的键,而不是值 - 可能吗?

发布于 2024-12-02 11:30:30 字数 966 浏览 1 评论 0原文

获取 ListPreference 中当前所选项目的很简单:

String selected = sharedPrefs.getString(
    getString(R.string.list_preference_array),
    "default string"
);

但现在我需要获取当前所选项目的 。这可能吗?

澄清一下,XML 文件中的典型 ListPreference 定义具有以下组件:

<ListPreference 
    android:key="@string/list_preference_array"
    android:title="Title of ENTIRE list (not seen by user?)"
    android:summary="this is what the user sees in small fonts" 
    android:defaultValue="just in case"
    android:entries="@array/user_friendly_labels" 
    android:entryValues="@array/code_meaningful_strings"
    android:dialogTitle="User Prompt(big font)" 
    android:showDefault="true"
    android:showSilent="true" 
/>

sharedPrefs.getString() 返回的是 android:entryValues 中的当前选择。我感兴趣的是从 android:entries 中获取当前的选择。我错误地将其称为“关键”,但实际上它是一个“对应标签”,它一定与实际内容不同。

Getting the value of the currently selected item in a ListPreference is straightforward:

String selected = sharedPrefs.getString(
    getString(R.string.list_preference_array),
    "default string"
);

But now I need to get the key of the currently selected item, instead. Is this possible?

To clarify, a typical ListPreference definition in the XML file has the following components:

<ListPreference 
    android:key="@string/list_preference_array"
    android:title="Title of ENTIRE list (not seen by user?)"
    android:summary="this is what the user sees in small fonts" 
    android:defaultValue="just in case"
    android:entries="@array/user_friendly_labels" 
    android:entryValues="@array/code_meaningful_strings"
    android:dialogTitle="User Prompt(big font)" 
    android:showDefault="true"
    android:showSilent="true" 
/>

What sharedPrefs.getString() returns is the current selection from android:entryValues. What I am interested in getting is the current selection from android:entries. I mistakenly called it "key" but really it is a "corresponding label", which must be different than actual content.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

花开柳相依 2024-12-09 11:30:30

一点猜测:

int index = mylistpreference.findIndexOfValue(selected)  // <- selected taken from your code above
String entry = mylistpreference.getEntries()[index];

A bit of a guess:

int index = mylistpreference.findIndexOfValue(selected)  // <- selected taken from your code above
String entry = mylistpreference.getEntries()[index];
蓝色星空 2024-12-09 11:30:30

只需使用:

mylistpreference.getEntry()

获取 mylistpreference use:

mylistpreference= (ListPreference) getPreferenceScreen().findPreference(key);

key 是您在preference.xml中定义的 android:key <列表首选项>标签。

just use:

mylistpreference.getEntry()

to get mylistpreference use:

mylistpreference= (ListPreference) getPreferenceScreen().findPreference(key);

key is the android:key you defined in preference.xml inside < ListPreference> tag.

欢烬 2024-12-09 11:30:30

该函数是 定义

SharedPreferences.getString(String key, String defaultValue);

所以在您的示例代码中,getString(R.string.select_string)将返回密钥。

添加 SharedPreference 时,您需要指定键,因此该键将与您用于设置值的键相同。

编辑

使用 SharedPreferences.getString() 并将 ListPreference 键作为键将返回用户从列表中选择的值。您不需要为 ListPreference 数组中的每个选项创建键,并且这些键不会自动创建。与 ListPreference 的 entryValues 相关的用例语句。

The function is defined as

SharedPreferences.getString(String key, String defaultValue);

So in your example code, getString(R.string.select_string) would return the key.

When you add the SharedPreference, you need to specify the key, so the key would be the same one you used to set the value.

Edit:

using SharedPreferences.getString() with the ListPreference key as the key will return the value the user selected from the list. You don't need to create keys for each option in the ListPreference array, and these keys aren't created automatically. Use case statements that correlate to the ListPreference's entryValues.

尤怨 2024-12-09 11:30:30

@shai 你的方法滞后于最后选择的条目

listPreference.getEntry()

@Erik 的方法效果很好

int index = listPreference.findIndexOfValue((String) value)
String entry = listpreference.getEntries()[index];

@shai Your method lags to last selected entry

listPreference.getEntry()

Rather @Erik 's method works nicely

int index = listPreference.findIndexOfValue((String) value)
String entry = listpreference.getEntries()[index];
简美 2024-12-09 11:30:30

正确更新 ListPreference 的摘要(使用标签,而不是键)。

   @Override
    public boolean onPreferenceChange(Preference preference, Object value) {
        String stringValue = value.toString();

        if (preference instanceof ListPreference) {
            ListPreference listPreference = (ListPreference) preference;
            int prefIndex = listPreference.findIndexOfValue(stringValue);
            if (prefIndex >= 0) {
                CharSequence[] labels = listPreference.getEntries();
                preference.setSummary(labels[prefIndex]);
            }
        } else {
            preference.setSummary(stringValue);
        }
        return true;

    }

To properly update the summary of a ListPreference (using the label, instead of the key).

   @Override
    public boolean onPreferenceChange(Preference preference, Object value) {
        String stringValue = value.toString();

        if (preference instanceof ListPreference) {
            ListPreference listPreference = (ListPreference) preference;
            int prefIndex = listPreference.findIndexOfValue(stringValue);
            if (prefIndex >= 0) {
                CharSequence[] labels = listPreference.getEntries();
                preference.setSummary(labels[prefIndex]);
            }
        } else {
            preference.setSummary(stringValue);
        }
        return true;

    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文