Android PreferenceScreen onChangeListener не вызывается
Я написал простой PreferenceScreen, выглядит следующим образом:
public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
PreferenceScreen prefScreen = getPreferenceScreen();
prefScreen.setOnPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference.getTitle().equals(getString(R.string.settings_diverse_about))) {
// TODO open about dialog
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
private static String PATTERN_EMAIL = "[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}";
private static String PATTERN_TWITTER = "[a-zA-Z0-9_-]+";
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String prefTitle = preference.getTitle().toString();
// phone will be fully handled by inputType
String newStr = newValue.toString();
if (prefTitle.equals(getString(R.string.settings_contact_email))) {
return newStr.trim().matches(PATTERN_EMAIL);
} else if (prefTitle.equals(getString(R.string.settings_contact_twitter))) {
return newStr.trim().matches(PATTERN_TWITTER);
}
return true;
}
Проблема в том, что метод onPreferenceChange никогда не вызывается. Кроме того, что вы думаете о способе проверки атрибутов? Я думаю, что это не совсем оптимально.
preference.getTitle().equals(getString(R.string.settings_diverse_about))
1 ответ
Решение
У меня такая же проблема. Я пытался настроить onPreferenceChangeListener, но это было неправильно. Что мне действительно нужно, так это onSharedPreferenceListener.
OnSharedPreferenceChangeListener listener;
Запишите это в onCreate() вашего действия Preference:
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// Here you can work.
// IMPORTANT: Beware that at this point the preference has already been changed!
}
};
SharedPreferences prefs = getSharedPreferences(getPackageName() + "_preferences", MODE_PRIVATE);
prefs.registerOnSharedPreferenceChangeListener(listener);