Я небольшой шаг для завершения процедуры проверки числовых предпочтений.
Я заменил кнопку EditTextPrefernce OK onClickListener, чтобы избежать выхода из диалогового окна, если запись не является числовой.
Я использую TextWatcher.afterTextChanged, чтобы проверить, является ли запись числовой или нет, и я поместил правильную оценку тега EditText.
Все работает хорошо, нажав OK, когда запись недействительна, не покидает диалоговое окно, нажимая «ОК», когда запись действительна ... здесь Мне нужно вызвать оригинальную кнопку OK onClick, , но я не нашел, как для этого. Есть функции просмотра функции callOnClick() и performOnClick(), но я просмотрел их код, и они предназначены для вызова установленного слушателя, а не оригинального.Android Проверка правильности для EditTextPreference
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "+ onCreate(savedInstanceState:" + savedInstanceState + ")");
super.onCreate(savedInstanceState);
...
prefMaxLogs = (EditTextPreference) findPreference(getText(R.string.pref_maxLogs_key));
prefMaxLogsEt = prefMaxLogs.getEditText();
prefMaxLogsEt.setSingleLine();
prefMaxLogsEt.setOnFocusChangeListener(ofcl);
prefMaxLogsEt.addTextChangedListener(tw);
...
Log.d(TAG, "- onCreate()");
}
private OnFocusChangeListener ofcl = new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
Log.d(TAG, "+ onFocusChange(v:" + v + ", hasFocus:" + hasFocus + ")");
if(hasFocus) {
prefMaxLogsEt.selectAll();
Dialog dialog = prefMaxLogs.getDialog();
if(dialog != null) {
dialog.findViewById(android.R.id.button1).setOnClickListener(ocl);
}
}
Log.d(TAG, "- onFocusChange()");
}
};
private OnClickListener ocl = new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "+ onClick(v:" + v + ")");
Boolean valid = !(Boolean) prefMaxLogsEt.getTag(R.string.invalidEntry);
if(valid) {
Log.d(TAG, "Valid et");
}
Log.d(TAG, "- onClick()");
}
};
private TextWatcher tw = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
Log.d(TAG, "+ afterTextChanged(s:" + s + ")");
String source = s.toString();
//prefMaxLogsEt.removeTextChangedListener(this);
if(!source.matches("^[0-9]+$")) {
prefMaxLogsEt.getBackground().setColorFilter(getResources().getColor(R.color.invalid), Mode.SRC_IN);
prefMaxLogsEt.invalidate();
prefMaxLogsEt.setError(getText(R.string.invalidEntry));
prefMaxLogsEt.selectAll();
prefMaxLogsEt.setTag(R.string.invalidEntry, true);
} else {
prefMaxLogsEt.setError(null);
prefMaxLogsEt.getBackground().clearColorFilter();
prefMaxLogsEt.invalidate();
prefMaxLogsEt.setTag(R.string.invalidEntry, false);
}
//prefMaxLogsEt.addTextChangedListener(this);
Log.d(TAG, "- afterTextChanged()");
}
};
The onClickListener устанавливается, когда EditText получает фокус, потому что я знаю, что диалог уже показывает.
OnClickListener предотвращает закрытие диалогового окна с недопустимыми записями
Почему бы не просто использовать 'preference.onPreferenceChangedListener()'? –
@AleksG Я ответил на это решение, когда вы разместили свой комментарий. – ilomambo