首选项的首选项屏幕更新摘要

Preference screen update summary for preference

我通过扩展 RingtonePrefernce 实现了自定义首选项。我确实覆盖了 getSummary 方法,该方法在更新 pref 时动态 returns pref 的值。

但问题是在主 pref 屏幕上,当 pref 关闭时更新的值没有反映出来。 如果我向下滚动主 pref 屏幕 down/up 并且当 pref 离开屏幕并返回屏幕时,唯一一次 pref summay 在主屏幕中更新。所以基本上当它重绘时。

我该如何解决?

列出所有首选项的主性能屏幕代码

  public class MainActivity extends PreferenceActivity implements
            OnPreferenceClickListener, Preference.OnPreferenceChangeListener {

@SuppressLint("Deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SoundUtils.stopPlaying();

        ringtoneManager = new RingtoneManager(getApplicationContext());
        featureManager =  FeatureManager.getInstance(this);
        beepActionManager= new BeepActionManager();
        addPreferencesFromResource(R.xml.preferences_settings);
       //other code
  }
}

并且在 preferences_settings 中我的偏好被添加为

 <PreferenceCategory android:title="@string/sound_settings">
        <com.mindedges.beephourly.utils.CustomRintonePreference
            android:defaultValue="content://settings/system/notification_sound"
            android:key="ringtone_pref"
            android:ringtoneType="all"
            android:title="@string/hr_beep_tone_title"
            android:summary="@string/hr_beep_tone_summary"/>

        <com.mindedges.beephourly.utils.CustomRintonePreference


    </PreferenceCategory>

据我所知,PreferenceScreen 中的 ListView 需要在 PreferenceScreenonResume() 中使用 ListView.invalidate() 函数使之无效在 RingtonePreference 关闭后被调用。

我检查了你的代码并创建了测试项目,找到了解决方案。 我认为你应该通知你的自定义偏好你改变了它。 'RingtonePreference' 具有名为 'onSaveRingtone' 的回调方法,您需要在覆盖 'onSaveRingtone' 时调用 'notifyChnaged' 函数。 这是我测试的代码。

public class CustomPreference extends RingtonePreference {
    public CustomPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public CustomPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomPreference(Context context) {
        super(context);
    }

    @Override
    protected void onSaveRingtone(Uri ringtoneUri) {
        super.onSaveRingtone(ringtoneUri);

        notifyChanged();
    }

    @Override
    public CharSequence getSummary() {
        return "Date " + System.currentTimeMillis();
    }
}