ListPreference摘要不格式化

时间:2011-07-18 19:52:03

标签: android preferences listpreference

我有一个ListPreference,我想在摘要中显示当前条目。根据{{​​3}},我应该可以通过在摘要字符串中包含%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级别的几个模拟器中尝试了这个。我需要做什么才能使显示的摘要始终反映当前值?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

只有在加载“首选项”屏幕时预先填充getSummary()getEntries()getEntryValues()时,ListPreference中的原始defaultValue才有效。因此,当您使用静态的固定项目列表(例如<string-array>资源)时,它会很好地工作。

但是,如果要在运行时动态生成entriesentryValues,则需要确保在同时加载onCreate()和{{3}的“首选项”屏幕时生成这些列表。 }。像这样:

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="...",并且它指向“值”数组中的有效项。例如:android:defaultValue="Item A Value"

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