Android列表首选项:将摘要作为选定值?

Fra*_*ick 108 java android

我有一个Preference活动,它使用我的XML文件定义的List Preferences.如何将列表活动的摘要设置为所选的值?

谢谢!

Geo*_*ard 394

最简单的方法就是让Android为您完成.假设您希望摘要与所选值匹配,您可以使用XML或Java中的方法简单地设置ListPreferenceto 的摘要"%s"setSummary.例如:

<ListPreference
    android:key="pref_list"
    android:title="A list of preferences"
    android:summary="%s"
    android:entries="@array/pref_list_entries"
    android:entryValues="@array/pref_list_entries_values"
    android:defaultValue="0" />
Run Code Online (Sandbox Code Playgroud)

Android将替换%s为首选项的当前字符串值,如ListPreference选择器所显示的那样.当您输入活动时,也会正确设置列表的摘要 - 您不必编写任何特殊代码来进行初始设置.

我花了太多时间摆弄ListPreference听众,我发现在这之前.

  • 我必须结合这个机智手动更新...因为当值改变时摘要不会更新... (7认同)
  • 但是当值改变时如何更新它? (6认同)
  • 很好的答案.信不信由你,但事实证明:http://developer.android.com/reference/android/preference/ListPreference.html#setSummary(java.lang.CharSequence) (4认同)

Axe*_*xel 28

您可以使用OnPreferenceChangeListener动态更改摘要.问题是它获取选定的值(from android:entryValues),而不是caption(android:entries).在我使用的以下代码中toString(),但正确的解决方案是找到值的标题.无论如何,这个想法是有效的:

public class Preferences extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.your_prefs);

        ListPreference listPreference = (ListPreference) findPreference("preference_key");
        if(listPreference.getValue()==null) {
            // to ensure we don't get a null value
            // set first value by default
            listPreference.setValueIndex(0);
        }
        listPreference.setSummary(listPreference.getValue().toString());
        listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                preference.setSummary(newValue.toString());
                return true;
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


mid*_*nhk 18

我也希望实现类似的功能,但/sf/answers/570852061/的问题在于,它显示了我的偏好值(如1,2 3等).我想显示与所选值对应的条目(人类可读字符串).

所以我用这种方式改变它并以我需要的方式工作.

listPreference.setSummary(servicePreference.getEntry().toString());
listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            // Set the value as the new value
            listPreference.setValue(newValue.toString());
            // Get the entry which corresponds to the current value and set as summary
            preference.setSummary(listPreference.getEntry());
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

诀窍是使用getEntry()而不是,getValue()一旦值改变,显式设置值并读回条目.


Nat*_*ein 11

如此简单 - 只需将以下属性添加到您的 XML 定义中 -

<ListPreference
...    
app:useSimpleSummaryProvider="true"
...
/>
Run Code Online (Sandbox Code Playgroud)

  • 我认为这应该被投票,因为这似乎是 %s 的首选解决方案。至少根据我在 logcat 中收到的消息:“不再支持使用字符串格式标记设置摘要。您应该改用 SummaryProvider”。 (6认同)

42G*_*eek 6

我认为您要查找的内容非常简单,可以在Preference项目中添加以下代码行:

android:summary="%1$s"
Run Code Online (Sandbox Code Playgroud)

因此它将看起来像这样:

<ListPreference
            android:key="@string/pref_temp_key"
            android:title="@string/pref_temp_title"
            android:dialogTitle="@string/pref_temp_dialog_title"
            android:entries="@array/pref_tempUnit_entries"
            android:entryValues="@array/pref_tempUnit_entries"
            android:summary="%1$s"
            android:defaultValue="@string/pref_temp_default_value" />
Run Code Online (Sandbox Code Playgroud)


cot*_*aws 3

首先在 onCreate 中获取对 ListPreference 的引用。您可以使用 findPreference()。例如:

ListPreference pref = (ListPreference) findPreference("thePreferencesKey");
Run Code Online (Sandbox Code Playgroud)

然后,当您首次加载 Activity 时以及每当首选项值发生更改时,请使用您想要获取 ListPreference 的值的任何方法并使用以下命令设置摘要:

pref.setSummary(theNewString);
Run Code Online (Sandbox Code Playgroud)