5

Вопрос по android-widget, android – RingtonePreference не запускается OnPreferenceChangeListener

Любое другое предпочтение, которое у меня есть, запускает свой 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;
}
});
  • Это как-то связано с Preference Activity, имеющим метод onActivityResult.

    от LiteWait
  • 0

    Те

    кто все еще сталкивается с проблемой, если вы используете фрагмент предпочтения, добавьте следующий код в фрагмент предпочтения`

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

    После этого ваш метод onPreferenceChange должен быть вызван

  • 2

    Обратите внимание

    что RingtonePreference использует Activity для средства выбора мелодии звонка.

    Если вы используете RingtonePreference в поддержке PreferenceFragment (android.support.v4.preference.PreferenceFragment), тогда RingtonePreference заканчивается ошибочно, используя родительский Activity вместо PreferenceFragment при вызовеstartActivityForResult, Это означает, чтоonActivityResult callback также вызывается для родительского Activity. Самый простой способ решить эту проблему - переопределитьonActivityResult в родительском Activity и убедитесь, что он перенаправляет обратный вызов в 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);
        }
    }
    

  • 11

    onActivityResult должен был вызвать super.onActivityResult это исправи

    ть