2012-04-04 9 views
5

Cada otra preferencia que tengo activa su OnPreferenceChangeListener. Sin embargo, mi RingtonePreference no es así:RingtonePreference no activa 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

Esto tiene algo que ver con la actividad de preferencia que tiene un método onActivityResult. – LiteWait

Respuesta

12

onActivityResult tuvo que llamar super.onActivityResult es la solución

2

Tenga en cuenta que una RingtonePreference utiliza una actividad para el selector de tono de llamada.

Si está utilizando una referencia de tono de llamada en un PreferenceFragment de soporte (android.support.v4.preference.PreferenceFragment), entonces la referencia de tono de timbre termina erróneamente utilizando la actividad primaria en lugar del Fragmento de preferencia al llamar al startActivityForResult. Esto significa que también se llama a la devolución de llamada onActivityResult en la Actividad padre. La solución más fácil para solucionar este problema es anular onActivityResult en la Actividad principal y asegurarse de que reenvía la devolución de llamada a PreferenceFragment. Por ejemplo así:

@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

Los que todavía se enfrentan a un problema, si está utilizando fragmento de preferencia continuación, agregue el siguiente código dentro de la preferencia 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); 
    } 

Después de esto el método debe ser llamado onPreferenceChange

Cuestiones relacionadas