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 は、着信音ピッカーのアクティビティを使用することに注意してください。

サポート PreferenceFragment( android.support.v4.preference.PreferenceFragment) で RingtonePreference を使用している場合、RingtonePreference は、呼び出し時に PreferenceFragment ではなく親アクティビティを誤って使用してしまいstartActivityForResultます。これは、onActivityResultコールバックが親アクティビティでも呼び出されることを意味します。この問題を解決する最も簡単な回避策onActivityResultは、親アクティビティでオーバーライドし、コールバックを 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 に答える