Как сделать один “слушатель” для разных EditText,

79
03 мая 2021, 23:50

Есть два 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:
}
Answer 1

В таких случаях я просто переопределяю стандартный TextWatcher(Клик). Иных элегантных решений я не встречал.

Answer 2

Не совсем понятны ваши цели, но я делал следующим образом, если у меня есть одинаковые действия для разных 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, но в принципе, разницы особой нет.

READ ALSO
Динамический массив целых чисел

Динамический массив целых чисел

Спроектируйте класс Array

88
Синхронизация папки GoogleDrive

Синхронизация папки GoogleDrive

GoogleDrive для ПК умеет синхронизировать определённую папку, можно ли это настроить как-то на Андроиде? Если да, то было бы отлично сделать это...

79
Java Timer. Отсчет времени после старта потока

Java Timer. Отсчет времени после старта потока

Я использую Timer и устанавливаю таймер через метод shedule(), задавая повтор каждые N секундНо столкнулся с проблемой, мне необходимо запускать...

81
Как запустить несколько проектов на Eclipse?

Как запустить несколько проектов на Eclipse?

Мне необходимо запустить сразу несколько разных проекта на эклипсе, как это можно сделать?

101