【问题标题】:Get Key, not value, of the ListPreference selection - Possible?获取 ListPreference 选择的键,而不是值 - 可能吗?
【发布时间】:2011-08-31 17:46:51
【问题描述】:

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

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

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

为了澄清,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 的当前选择。我错误地称它为“key”,但实际上它是一个“对应标签”,它必须与实际内容不同。

【问题讨论】:

  • 不是 getString(R.string.select_string) 的关键吗?
  • @Erik getString(R.string.select_string) 是整个 ListPreference 数组的键(“名称”),而不是选择。
  • @uTubeFan,如果您使用 ListPreference,则所选项目没有键,只有一个条目...
  • @John Hmmm... 那android:entries= 是什么意思?返回的字符串是来自android:entryValues= 的选择,但我需要获取选定的条目(由于缺少更好的名称,我可能错误地将其称为“键”)。
  • android:entries 是用户在列表弹出时将看到的文本,而android:entryValues 是用户单击条目后将返回给您的值。您的代码中的任何内容都不需要 android:entries 值。如果您确实需要它,那么您应该将entriesentryValues 设置为相同的东西。

标签: android android-preferences


【解决方案1】:

有点猜想:

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

【讨论】:

    【解决方案2】:

    只需使用:

    mylistpreference.getEntry()
    

    获取 mylistpreference 使用:

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

    key 是您在 标签内的preference.xml 中定义的android:key。

    【讨论】:

      【解决方案3】:

      函数是defined

      SharedPreferences.getString(String key, String defaultValue);
      

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

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

      编辑:

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

      【讨论】:

      • 查看我对@Erik 评论的回复。
      【解决方案4】:

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

      listPreference.getEntry()
      

      @Erik 的方法效果很好

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

      【讨论】:

        【解决方案5】:

        正确更新 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;
        
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-16
          • 2015-09-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多