5

我拥有的所有其他首选项都会触发其 OnPreferenceChangeListener。但是,我的 RingtonePreference 它没有:

p = getPreferenceScreen().findPreference("pref_tone");
String rname = preferences.getString("pref_tone",Settings.System.DEFAULT_RINGTONE_URI.toString());
String name = ringtoneToName(rname);
p.setSummary(name);
p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
    // Never hits here!
    String v = (String) newValue;
    preference.setSummary(ringtoneToName(v));           
    return true;
}
});
4

3 回答 3

11

onActivityResult 必须调用 super.onActivityResult 是修复

于 2012-04-04T22:54:57.803 回答
2

请注意,RingtonePreference 使用 Activity 作为铃声选择器。

如果您在支持 PreferenceFragment( android.support.v4.preference.PreferenceFragment) 中使用 RingtonePreference,那么 RingtonePreference 在调用时会错误地使用父 Activity 而不是 PreferenceFragment startActivityForResult。这意味着onActivityResult回调也会在父 Activity 上被调用。解决此问题的最简单解决方法是onActivityResult在父 Activity 中覆盖并确保它将回调转发到 PreferenceFragment。例如像这样:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Fragment f = getSupportFragmentManager().findFragmentByTag(PREFERENCE_FRAGMENT_TAG);
    if (f != null) {
        f.onActivityResult(requestCode, resultCode, data);
    }
}
于 2016-08-10T06:03:10.353 回答
0

那些仍然面临问题的人,如果您正在使用首选项片段,请在首选项片段中添加以下代码`

findPreference(getString(R.string.notification_key)).setOnPreferenceChangeListener(this);

@Override
public boolean onPreferenceChange(Preference preference, Object newVal) {

    if (preference.getKey().equals(getString(R.string.notification_key))) {

        Ringtone ringtone = RingtoneManager.getRingtone(getActivity(), Uri.parse(newVal.toString()));
        String name = ringtone.getTitle(getActivity());
        preference.setSummary(name);
    }

    return false;
}

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode,resultCode,data);
    }

在此之后你的 onPreferenceChange 方法应该被调用

于 2017-02-22T18:58:25.683 回答