Краткий обзор:Android: onPreferenceChange с проверкой
Я построил проверки, которая работает с onPreferenceChanged на примере проекта разработан только для проверки параметров и как они сохраняются и такие. Функциональность все там и работает, как я этого хочу. Я надеялся, что смогу перенести эту функциональность в созданный по умолчанию класс SettingsActivity, поскольку он, как представляется, обеспечивает прочную функциональность и очень необходимые заголовки для расширения программы.
Сам код, который я хотел бы реализовать, - это то, что представлено ниже. Очень коротко у меня есть чек, который решает, нужно ли выполнить конкретную проверку или нет, и если это так придает конкретный, в противном случае он присоединяется к общему. Я считаю, что это хакерский метод и хотел бы, если возможно, альтернативы.
// Type of verification checking to attach
public void attachOnPreferenceChangedListener(Preference dsp_pref) {
if (dsp_pref.getKey().equals("et_targetPref")) {
attachTargetVerifier(dsp_pref);
} else { // Any non verifier specific is given a generic listen with summary updater
attachGenericVerifier(dsp_pref);
}
}
private void attachGenericVerifier(Preference dsp_pref) {
dsp_pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
updatePrefSummary(preference);
return true;
}
});
}
private void attachTargetVerifier(Preference dsp_pref) {
dsp_pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Pattern dsl_pattern = Pattern.compile(URL_REGEX,Pattern.CASE_INSENSITIVE);
Matcher dsl_matcher = dsl_pattern.matcher(newValue.toString());
if (!dsl_matcher.matches()) {
Toast.makeText(getActivity(), "Invalid URL. Example: http://example.com/target", Toast.LENGTH_LONG).show();
} else if (dsl_matcher.group(1).toLowerCase().endsWith("/target")) {
Toast.makeText(getActivity(), "Preference Saved", Toast.LENGTH_LONG).show();
updatePrefSummary(preference);
return true;
} else if(dsl_matcher.group(2) == null) {
Toast.makeText(getActivity(), "URL must start with 'http://'", Toast.LENGTH_LONG).show();
} else {
}
return false;
}
});
}
Что SettingsActivity по умолчанию предоставляет только простой и прямой OnPreferenceChange переопределение, что, вероятно, означает, что проверка проверка должна быть интегрирована здесь, если более элегантный метод не существует, и в этом случае я все уши:
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
String stringValue = value.toString();
if (preference instanceof ListPreference) {
// For list preferences, look up the correct display value in
// the preference's 'entries' list.
ListPreference listPreference = (ListPreference) preference;
int index = listPreference.findIndexOfValue(stringValue);
// Set the summary to reflect the new value.
preference.setSummary(
index >= 0
? listPreference.getEntries()[index]
: null);
} else if (preference instanceof RingtonePreference) {
// For ringtone preferences, look up the correct display value
// using RingtoneManager.
if (TextUtils.isEmpty(stringValue)) {
// Empty values correspond to 'silent' (no ringtone).
preference.setSummary(R.string.pref_ringtone_silent);
} else {
Ringtone ringtone = RingtoneManager.getRingtone(
preference.getContext(), Uri.parse(stringValue));
if (ringtone == null) {
// Clear the summary if there was a lookup error.
preference.setSummary(null);
} else {
// Set the summary to reflect the new ringtone display
// name.
String name = ringtone.getTitle(preference.getContext());
preference.setSummary(name);
}
}
} else {
// For all other preferences, set the summary to the value's
// simple string representation.
preference.setSummary(stringValue);
}
return true;
}
};
Цените какие-либо рекомендации о том, как это может быть сделано без него становится неуправляемым
Также обратите внимание на бит конфликта из-за того, что sBindPreferenceSummaryToValueListener является статичным, делая любое типичное предупреждение «Тосты» как ответ невероятным, если я не могу как-то разрешить контекст. Все еще не уверен, как это сделать. – Ben