onSharedPreferenceChanged问题中的setSummary(txt)

时间:2011-03-31 12:39:54

标签: android preferences summary

我在这样的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。

这是因为:

  

public class Muteny extends 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“启用”(此时不执行任何操作,但触发更改),则会在切换“日期框”时更新摘要,如我所希望的那样。

虽然显示了Toast IS中的消息......

检查“日期框”时,如何更新PreferenceScreen的摘要?

1 个答案:

答案 0 :(得分:3)

此问题经常出现。

以下是您可以查看可能的解决方案的其他几个答案。我从来没有找到一个让我百分百快乐的解决方案。

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();
    }
}