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性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...