2012-04-04 13 views
5

Co innego preferencji Mam uruchomił OnPreferenceChangeListener. Jednak moja RingtonePreference nie robi:RingtonePreference nie uruchamia 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

Ma to coś wspólnego z aktywnością preferencji z metodą onActivityResult. – LiteWait

Odpowiedz

12

onActivityResult musiałem zadzwonić super.onActivityResult jest poprawka

2

Uwaga że RingtonePreference używa aktywności dla próbnika dzwonek.

Jeśli korzystasz z RingtonePreference w PreferenceFriter wsparcia (android.support.v4.preference.PreferenceFragment), to RingtonePreference kończy się błędnie przy użyciu Parent Activity zamiast PreferenceFragment podczas wywoływania startActivityForResult. Oznacza to, że wywołanie zwrotne onActivityResult jest wywoływane również w działaniu nadrzędnym. Najłatwiejszym sposobem rozwiązania tego problemu jest zastąpienie onActivityResult w działaniu nadrzędnym i upewnienie się, że przekazuje ono wywołanie zwrotne do PreferenceFragment. Na przykład tak:

@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

Ci, którzy wciąż stoi problem, jeśli używasz preferencji fragment następnie dodaj następujący kod wewnątrz preferencji 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); 
    } 

Po tym metodę onPreferenceChange powinno się nazywa