我有一个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级别的几个模拟器中尝试了这个。我需要做什么才能使显示的摘要始终反映当前值?
答案 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>
资源)时,它会很好地工作。
但是,如果要在运行时动态生成entries
和entryValues
,则需要确保在同时加载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"
对于动态生成的列表和静态列表将正常工作。