Есть ли у кого-нибудь образец кода для проверки введенного пользователем текста в настройках? Например, у меня есть EditTextPreference для ввода пользователем адреса электронной почты. Я хотел бы подтвердить формат введенного адреса электронной почты и открыть диалоговое окно предупреждения, если формат неверен. У кого-нибудь есть образец кода для этого? БлагодаряКак вы проверяете формат и значения EditTextPreference, введенные в Android 2.1?
ответ
Реализовать Preference.OnPreferenceChangeListener
булево onPreferenceChange (предпочтение предпочтений, объект новое_значение)
Вызывается, когда предпочтение было изменено пользователем. Это вызывается до того, как состояние Preference будет обновлено и до того, как будет сохранено состояние.
Возвращает True, чтобы обновить состояние Предпочтения с новым значением.
Таким образом, вы можете напрямую вернуть результат проверки ценности.
public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
findPreference("mail_preference_key").setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
return Pattern.matches("mailPattern", (String) newValue);
}
});
}
}
Я хотел бы использовать Preference.OnPreferenceChangeListener
вместо SharedPreferences.OnSharedPreferenceChangeListener
.
Первый позволяет проверить новое значение до его сохранения (и предотвратить его сохранение), а не после.
Ваш вопрос был ранним хитом Google, когда я пытался сделать то же самое, поэтому, надеюсь, это помогает кому-то. Вот что я сегодня взломал, демонстрируя OnPreferenceChangeListener, что позволяет остановить недействительные изменения.
в вашем фрагменте:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
Your_Pref = (EditTextPreference) getPreferenceScreen().findPreference("Your_Pref");
Your_Pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Boolean rtnval = true;
if (Your_Test) {
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Invalid Input");
builder.setMessage("Something's gone wrong...");
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
rtnval = false;
}
return rtnval;
}
});
}
У меня есть следующий код: \t \t если (key.equals ("update_delay")) { \t \t \t Строка Новое_значение = sp.getString (ключ, нуль) ; .. \t \t \t, если (Integer.parseInt (NewValue) <60) \t \t \t \t sp.edit() putString ("update_delay", "60") фиксации(); } , и в следующий раз, когда я нажимаю на EditTextPreference, он все еще показывает низкое значение. Знаете ли вы, что commit() не работает в этом контексте? – sargas
Я не уверен, но в методе метода фиксации указывается 1. Обратите внимание, что, когда два редактора изменяют предпочтения в одно и то же время, последний для вызова совершает выигрыши. 2. Возвращает true, если новые значения были успешно записаны в постоянное хранилище. Пункт 1: Возможно, пользовательский редактор совершает последний звонок. Пункт 2: Проверьте, верен ли commit. Надеюсь, что эта помощь. – Fede
Разве это не называется после того, как изменение сделано? Я полагаю, что Аарон имеет правильный ответ. – iozee