2012-04-04 14 views
5

Jede andere Präferenz habe ich feuert seine OnPreferenceChangeListener. Allerdings ist mein RingtonePreference es nicht:RingtonePreference nicht feuern OnPreferenceChangeListener

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

Dies hat etwas damit zu tun, dass die Präferenzaktivität eine onActivityResult-Methode hat. – LiteWait

Antwort

12

onActivityResult super.onActivityResult nennen musste ist das Update

2

Beachten Sie, dass ein RingtonePreference eine Aktivität verwendet für den Klingelton-Picker.

Wenn Sie eine RingtonePreference in einem PreferenceFragment-Support (android.support.v4.preference.PreferenceFragment) verwenden, wird die RingtonePreference beim Aufruf von startActivityForResult fälschlicherweise mit der übergeordneten Aktivität statt PreferenceFragment beendet. Dies bedeutet, dass der Rückruf onActivityResult auch für die übergeordnete Aktivität aufgerufen wird. Die einfachste Problemumgehung, um dieses Problem zu beheben, besteht darin, onActivityResult in der übergeordneten Aktivität zu überschreiben und sicherzustellen, dass es den Rückruf an das PreferenceFragment weiterleitet. Zum Beispiel wie folgt aus:

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

Diejenigen, die noch vor Problem werden, wenn Sie bevorzugt Fragment verwendet, dann fügen Sie den folgenden Code innerhalb der Präferenz fragment`

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

Nach dieser Ihrer onPreferenceChange Methode sollte aufgerufen