我在XML文件中定义了一个PreferenceScreen,如下所示:
<PreferenceCategory android:title="Choose Days">
<PreferenceScreen android:title="Days of Week" android:key="daysOfWeek">
<CheckBoxPreference android:title="Mondays" android:key="chkMonday"></CheckBoxPreference>
<CheckBoxPreference android:title="Tuesdays" android:key="chkTuesday"></CheckBoxPreference>
<CheckBoxPreference android:title="Wednesdays" android:key="chkWednesday"></CheckBoxPreference>
<CheckBoxPreference android:title="Thursdays" android:key="chkThursday"></CheckBoxPreference>
<CheckBoxPreference android:title="Fridays" android:key="chkFriday"></CheckBoxPreference>
<CheckBoxPreference android:title="Saturdays" android:key="chkSaturday"></CheckBoxPreference>
<CheckBoxPreference android:title="Sundays" android:key="chkSunday"></CheckBoxPreference>
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:title="Other Settings">
<CheckBoxPreference android:title="Enable" android:defaultValue="true" android:key="enable"></CheckBoxPreference>
</PreferenceCategory>
当我单击PreferenceScreen:daysOfWeek时,会出现复选框,例如,当我选中或取消选中一个框时,就会触发onSharedPreferenceChanged。
这是因为:
公共类Muteny扩展PreferenceActivity实现OnSharedPreferenceChangeListener {
并在onResume中注册它,然后在我的.java文件中的onPause中取消注册它。
一个简化的onSharedPreferenceChanged看起来像这样:
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
PreferenceScreen daysOfWeek = ((PreferenceScreen)findPreference("daysOfWeek"));
daysOfWeek.setSummary("text for summary");
Toast.makeText(this.getApplicationContext(), "Hello", Toast.LENGTH_LONG).show();
}
问题是“ daysOfWeek”的摘要永远不会更新。如果然后我将CheckBoxPreference切换为“ enable”(目前不执行任何操作,但会触发更改),则摘要将按照我希望在切换“ day-boxes”时进行的方式进行更新。
虽然显示了Toast中的消息...
选中“日框”时,如何更新PreferenceScreen的摘要?
最佳答案
这个问题经常出现。
以下是一些其他答案,您可以在其中找到可能的解决方案。我从来没有想过让我100%满意的解决方案。
PreferenceScreen android:summary update !
Update existing Preference-item in a PreferenceActivity upon returning from a (sub)PreferenceScreen
在所有“解决方案”中,我已经看到一种似乎最有效的方法是在setSummary(...)调用之后调用onContentChanged()。关于这样做是否安全,存在一些争议。
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if (key.startsWith("chk")) {
PreferenceScreen prefscreen = ((PreferenceScreen)findPreference("daysOfWeek"));
prefscreen.setSummary(key);
onContentChanged();
}
}