铃声preference不费一枪onShared preferenceChanged [英] RingtonePreference not firing onSharedPreferenceChanged

查看:140
本文介绍了铃声preference不费一枪onShared preferenceChanged的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的preferences所有触发时一改onShared preferenceChanged事件。它适用于所有的preferences:复选框,列表,自定义等,但如果我选择从铃声preference铃声也不会被调用。我有这个code:

My Preferences all trigger the onSharedPreferenceChanged event upon a change. It works for all preferences: Checkbox, List, custom, etc. But it won't be called if I select a ringtone from the RingtonePreference. I have this 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" />

和我的类:

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

所有的preferences,除了铃声preference,达到方法onShared preferenceChanged。有没有人有一个想法?谢谢你。

All the preferences, except the RingtonePreference, reach method onSharedPreferenceChanged. Does anyone have an idea? Thanks.

推荐答案

我有这似乎是在Android系统中的错误同样的问题挣扎。 调试code后,我注意到听众不会被添加到我们的铃声preference听众地图,不像其他类,如表preference。

I struggled with the same problem which seems to be a bug in the android system. After debugging the code I noticed the listener is not added to our RingtonePreference listeners map, unlike other classes like ListPreference.

开了票,但现在我找到了一种方法使用在preferenceChangeListener去克服它。 我的code设置preference汇总到所选择的铃声,你可以用你的逻辑来代替。

I opened a ticket, but for now I found a way to overcome it using OnPreferenceChangeListener. My code sets the preference summary to the selected ringtone, you can use your logic instead.

首先让你的活动落实在preferenceChangeListener和写入preferenceChange方法

First make your activity implement OnPreferenceChangeListener and write the onPreferenceChange method

@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");
}

注意,不像onShared preferenceChanged,在preferenceChange叫做之前的preference更新,所以你必须使用newValue参数来获得获得所选数据,而不是它从preference。

Notice that unlike onSharedPreferenceChanged, onPreferenceChange is called before the preference is updated, so you must use the newValue parameter to get the selected data instead of getting it from the preference.

然后,在OnResume设置监听器:

Then, set the listener on 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);

}

希望这有助于。

Hope this helps.

这篇关于铃声preference不费一枪onShared preferenceChanged的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆