0

我有一个 ListPreference,我想在摘要中显示当前条目。根据ListPreference.getSummary()的文档,我应该能够通过包含%s在摘要字符串中来做到这一点。不幸的是,活动只显示%s在摘要中。

XML 非常标准:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <ListPreference
        android:key="displayMode"
        android:summary="@string/display_mode_summary"
        android:title="@string/display_mode"
        android:defaultValue="BOTH"
        android:entries="@array/displayModes"
        android:entryValues="@array/displayModeValues"
        />
</PreferenceScreen>

字符串的值display_mode_summary只是%s. (该值"BOTH"存在于displayModeValues数组中。)如果我像这样子类 ListPreference:

public final class DisplayModePreference extends ListPreference {
    // ...

    @Override
    public CharSequence getSummary() {
        return String.format(super.getSummary().toString(), getEntry());
    }
}

然后当偏好活动开始时,当前值被正确地插入到摘要中。但是,当我单击首选项并从对话框中选择不同的值时,当对话框关闭时,摘要仍然显示现在的旧值。我需要关闭首选项活动并重新启动它以查看更改。

我已经在不同 API 级别的几个模拟器中尝试过这个。我需要做什么才能使显示的摘要始终反映当前值?

4

2 回答 2

1

您可以覆盖“onDialogClosed”,如下所示:

@override
protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);

    if (positiveResult) {
        setSummary(getEntry());
    }
}

这会将您的偏好摘要设置为所选条目的文本。

于 2011-10-04T15:10:12.937 回答
0

getSummary()ListPreference 中的原始文件仅在 时有效getEntries()getEntryValues()并且defaultValue在加载首选项屏幕时预填充。因此,当您使用静态固定的项目列表(如<string-array>资源)时,它可以正常工作。

但如果您在运行时动态生成entriesand entryValues,则需要确保在加载 Preference 屏幕时生成这些列表,onCreate()确保defaultValue设置了。像这样的东西:

SettingsFragment.java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ListPreference listPreference = (ListPreference) findPreference("dynamiclistItems");

    CharSequence[] entryDisplayNames = new CharSequence[3];
    entryDisplayNames[0] = "Item A";
    entryDisplayNames[1] = "Item B";
    entryDisplayNames[2] = "Item C";

    CharSequence[] entryValues = new CharSequence[3];
    entryValues[0] = "Item A Value";
    entryValues[1] = "Item B Value";
    entryValues[2] = "Item C Value";

    listPreference.setEntries(entryDisplayNames);
    listPreference.setEntryValues(entryValues);

    if (listPreference.getValue() == null ||
         listPreference.getValue().equals("")) {
        // There is no stored string in shared prefs.
        // The user has not chosen any value. So make
        // the summary display a default entry "Item A"
        // display name, which is item 0 in the 'entries' list. Info:
        // https://stackoverflow.com/questions/5197228/how-to-set-the-default-value-of-a-listpreference
        listPreference.setValueIndex(0);
    }
}

对于用 填充的静态列表<string-array>,只需确保它android:defaultValue="..."已定义,并且它指向 'values' 数组中的有效项。例如:android:defaultValue="Item A Value"

这将确保android:summary="%s"动态生成的和静态的列表能够正常工作。

于 2018-08-07T19:48:53.823 回答