android – 铃声优先级未在SharedPreferenceChanged上触发

我的首选项将在更改后触发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)不同.

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

}

希望这可以帮助.

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...