RingtonePreference löst OnPreferenceChangeListener nicht aus

Jede andere Präferenz, die ich habe, löst den OnPreferenceChangeListener aus. Bei meiner RingtonePreference ist dies jedoch nicht der Fall:

<code>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;
}
});
</code>
 LiteWait04. Apr. 2012, 18:35
Dies hat etwas mit der Preference Activity zu tun, die eine onActivityResult-Methode hat.

Antworten auf die Frage(3)

Wenn Sie ein Präferenzfragment verwenden, fügen Sie den folgenden Code in das Präferenzfragment ein

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

Danach sollte Ihre onPreferenceChange-Methode aufgerufen werden

Lösung für das Problem

onActivityResult musste super.onActivityResult aufrufen, das Update

dass eine RingtonePreference eine Aktivität für die Klingeltonauswahl verwendet.

Wenn Sie eine RingtonePreference in einem Support PreferenceFragment verwenden (android.support.v4.preference.PreferenceFragment) dann wird die RingtonePreference beim Aufruf fälschlicherweise mit der übergeordneten Activity anstelle des PreferenceFragment beendetstartActivityForResult. Dies bedeutet, dass dieonActivityResult Rückruf wird auch für die übergeordnete Aktivität aufgerufen. Die einfachste Lösung, um dieses Problem zu beheben, ist das ÜberschreibenonActivityResult in der übergeordneten Aktivität und stellen Sie sicher, dass der Rückruf an das PreferenceFragment weitergeleitet wird. Zum Beispiel so:

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

Ihre Antwort auf die Frage