android - RingtonePreference not firing onSharedPreferenceChanged -
android - RingtonePreference not firing onSharedPreferenceChanged -
my preferences trigger onsharedpreferencechanged event upon change. works preferences: checkbox, list, custom, etc. won't called if select ringtone ringtonepreference. have code:
<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" />
and class:
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(); homecoming 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); } } }
all preferences, except ringtonepreference, reach method onsharedpreferencechanged. have idea? thanks.
i struggled same problem seems bug in android system. after debugging code noticed listener not added our ringtonepreference listeners map, unlike other classes listpreference.
i opened ticket, found way overcome using onpreferencechangelistener. code sets preference summary selected ringtone, can utilize logic instead.
first create activity implement onpreferencechangelistener , write onpreferencechange method
@override public boolean onpreferencechange(preference preference, object newvalue) { updateringtonesummary((ringtonepreference) preference, uri.parse((string) newvalue)); homecoming 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"); }
notice unlike onsharedpreferencechanged, onpreferencechange called before preference updated, must utilize newvalue parameter selected info instead of getting preference.
then, set listener on onresume:
@override protected void onresume() { super.onresume(); // patch overcome onsharedpreferencechange not beingness called ringtonepreference bug ringtonepreference pref = (ringtonepreference) findpreference(getstring(r.string.pref_ringtone)); pref.setonpreferencechangelistener(this); }
hope helps.
android
Comments
Post a Comment