每隔偏好我有触发其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;
}
});
onActivityResult只好打电话super.onActivityResult是修复
请注意,RingtonePreference使用的铃声选择器的活动。
如果你在一个支持PreferenceFragment(使用RingtonePreference android.support.v4.preference.PreferenceFragment
),那么RingtonePreference结束调用时错误地使用父活动,而不是PreferenceFragment的startActivityForResult
。 这意味着onActivityResult
回调函数被调用父活性。 要解决这个问题,最简单的解决方法是重写onActivityResult
父活动,并确保其转发回调到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);
}
}
这些谁仍然面临的问题,如果您使用的偏好片段然后添加偏好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);
}
在这之后您onPreferenceChange方法应该被调用