Есть два EditText etDay и etMonth. Есть два слушателя для каждого свой:
etDay.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() == 2){
if (s2i(String.valueOf(s),1) < 32) etMonth.requestFocus();
else etDay.setText("");
}
}
@Override
public void afterTextChanged(Editable arg0) { }
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
});
etMonth.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() == 2){
if (s2i(String.valueOf(s),1) < 13) etYear.requestFocus();
else etMonth.setText("");
}
}
@Override
public void afterTextChanged(Editable arg0) { }
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
});
Надо сделать один слушатель используя конструкцию:
switch (view.getId()){
case R.id.etDay: break;
case R.id.etMonth: break;
default:
}
В таких случаях я просто переопределяю стандартный TextWatcher(Клик). Иных элегантных решений я не встречал.
Не совсем понятны ваши цели, но я делал следующим образом, если у меня есть одинаковые действия для разных editText:
и так, идея в следующем, создаём свой EditText, наследуясь от стандартного, в нём переопределяем TextWatcher и выполняем в нём те действия которые вам нужны. Используем в xml переопределённый EditText. В xml: <your_package.custom_ui.CustomEditText ... />
. Профит!
Пункт два: если вы хотите что бы он выполнял ещё какие либо действия, но задавать их снаружи, делаем слушатель (интерфейс) и вызываем его метод в TextWatchere в том месте, где хотите чтобы он выполнился (до или после ваших основных манипуляций). Снаружи же, берёте созданный вами интерфейс и подпихиваете ему всё что вам нравится. Возможно не самое изящное решение, но вполне рабочее.
Если снаружи решите переопределить интерфейс TextWatcher-a внутренний использоваться не будет.
class CustomEditText @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = R.style.Widget_AppCompat_EditText_Custom,
defStyleRes: Int = R.style.Widget_AppCompat_EditText_Custom
) : EditText(context, attrs, defStyle, defStyleRes) {
private var onTextChangedListener: OnTextChangedListener? = null
fun setOnTextChangedListener(onTextChangedListener: OnTextChangedListener) {
this.onTextChangedListener = onTextChangedListener
}
init {
addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
validation(s)
onTextChangedListener?.onTextChangedListener(s)
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
})
}
private fun validation(s: Editable) {
//универсальный валидатор
}
interface OnTextChangedListener {
fun onTextChangedListener(s: Editable?)
}
}
etCustom.setOnTextChangedListener(object : CustomEditText.OnTextChangedListener {
override fun onTextChangedListener(s: Editable?) {
//дополнительный валидатор
}
})
P.S. готовое решение есть только под Kolin, но в принципе, разницы особой нет.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
GoogleDrive для ПК умеет синхронизировать определённую папку, можно ли это настроить как-то на Андроиде? Если да, то было бы отлично сделать это...
Я использую Timer и устанавливаю таймер через метод shedule(), задавая повтор каждые N секундНо столкнулся с проблемой, мне необходимо запускать...
Мне необходимо запустить сразу несколько разных проекта на эклипсе, как это можно сделать?