2012-04-04 27 views
5

Mọi sở thích khác tôi đã kích hoạt OnPreferenceChangeListener của nó. Tuy nhiên, RingtonePreference của tôi nó không:RingtonePreference không kích hoạt 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

Điều này có liên quan đến Hoạt động ưu tiên có phương thức onActivityResult. – LiteWait

Trả lời

12

onActivityResult phải gọi super.onActivityResult là việc sửa chữa

2

Lưu ý rằng một RingtonePreference sử dụng một Hoạt động cho bảng chọn nhạc chuông.

Nếu bạn đang sử dụng RingtonePreference trong hỗ trợ PreferenceFragment (android.support.v4.preference.PreferenceFragment) thì RingtonePreference sẽ kết thúc bằng cách sử dụng Activity cha thay vì PreferenceFragment khi gọi startActivityForResult. Điều này có nghĩa là cuộc gọi lại onActivityResult cũng được gọi trên Hoạt động gốc. Cách khắc phục dễ nhất để khắc phục sự cố này là ghi đè onActivityResult trong Hoạt động gốc và đảm bảo chuyển tiếp cuộc gọi lại đến PreferenceFragment. Ví dụ như thế này:

@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

Những người vẫn đang phải đối mặt vấn đề, nếu bạn đang sử dụng đoạn sở thích sau đó thêm đoạn mã sau vào bên trong sở thích 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); 
    } 

Sau đó phương pháp onPreferenceChange của bạn nên được gọi

Các vấn đề liên quan