我的首选项将在更改后触发onSharedPreferenceChanged事件.它适用于所有首选项:复选框,列表,自定义等.但是如果从铃声首选项中选择了一个铃声,则不会被调用.我有这个代码:
<CheckBoxPreference android:title="@string/pref_notification" android:defaultValue="true" android:summary="@string/pref_notification_summary" android:key="prefNotification" /> <RingtonePreference android:title="@string/pref_ringtone" android:key="prefRingtone" android:summary="@string/pref_ringtone_summary" android:ringtoneType="all" /> <CheckBoxPreference android:title="@string/pref_vibrate" android:defaultValue="true" android:summary="@string/pref_vibrate_summary" android:key="prefVibrationOn" /> <ListPreference android:title="@string/pref_notification_interval" android:summary="@string/pref_notification_interval_summary" android:key="prefNotificationInterval" android:defaultValue="60" android:entries="@array/prefs_interval" android:entryValues="@array/prefs_interval_values" />
和我的课:
public class TimePrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = this; addPreferencesFromResource(R.layout.preferences); Preference dbPref = (Preference) findPreference("prefDeleteDb"); dbPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { showWipeDbDialog(); return true; } }); } @Override public void onResume() { super.onResume(); prefs = PreferenceManager.getDefaultSharedPreferences(this); prefs.registerOnSharedPreferenceChangeListener(this); toggleEnableList(); } @Override public void onPause() { prefs.unregisterOnSharedPreferenceChangeListener(this); super.onPause(); } @Override public void onSharedPreferenceChanged(SharedPreferences arg0,String arg1) { boolean enabled = toggleEnableList(); if (enabled) { OnBootReceiver.setAlarm(TimePrefsActivity.this); } else { OnBootReceiver.cancelAlarm(TimePrefsActivity.this); } } }
除了铃声首选项之外,所有的首选项都可以在SharedPreferenceChanged上达到方法.有没有人有想法?谢谢.
解决方法
我也遇到了同样的问题,似乎是android系统中的一个bug.
调试代码后,我发现侦听器没有添加到我们的铃声优先级侦听器映射中,与其他类(例如ListPreference)不同.
调试代码后,我发现侦听器没有添加到我们的铃声优先级侦听器映射中,与其他类(例如ListPreference)不同.
我opened a ticket,但是现在我发现了一种使用OnPreferenceChangeListener克服它的方法.
我的代码将偏好摘要设置为所选铃声,可以使用您的逻辑.
首先使您的活动实现OnPreferenceChangeListener并写入onPreferenceChange方法
@Override public boolean onPreferenceChange(Preference preference,Object newValue) { updateRingtoneSummary((RingtonePreference) preference,Uri.parse((String) newValue)); return true; } private void updateRingtoneSummary(RingtonePreference preference,Uri ringtoneUri) { Ringtone ringtone = RingtoneManager.getRingtone(this,ringtoneUri); if (ringtone != null) preference.setSummary(ringtone.getTitle(this)); else preference.setSummary("Silent"); }
请注意,与onSharedPreferenceChanged不同,在优先级更新之前调用onPreferenceChange,因此您必须使用newValue参数来获取所选数据,而不是从首选项中获取.
然后,将侦听器设置为OnResume:
@Override protected void onResume() { super.onResume(); // A patch to overcome OnSharedPreferenceChange not being called by RingtonePreference bug RingtonePreference pref = (RingtonePreference) findPreference(getString(R.string.pref_ringtone)); pref.setOnPreferenceChangeListener(this); }
希望这可以帮助.