Улучшение синтаксиса функции расширения Kotlin только с одним интерфейсом метода, применяющим лямбду - PullRequest
0 голосов
/ 04 мая 2018

Я хочу улучшить синтаксис этой функции расширения, но я не знаю, как это сделать.

Моя идея состоит в том, чтобы сделать обертку из TextWatcher, где я собираюсь использовать только метод onTextChanged().

Я бы хотел чистое решение вроде view.setOnClickListener{}.

Это мой текущий код:

import android.text.Editable
import android.text.TextWatcher
import android.widget.EditText

interface OnTextChangedListener {
    fun onTextChanged(charSequence: CharSequence?, start: Int, before: Int, count: Int)
}

fun EditText.setOnTextChangedListener(listener: OnTextChangedListener) {
    this.addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(charSequence: CharSequence?, start: Int, count: Int, after: Int) {
        }

        override fun onTextChanged(charSequence: CharSequence?, start: Int, before: Int, count: Int) {
            listener.onTextChanged(charSequence, start, before, count)
        }

        override fun afterTextChanged(editable: Editable?) {
        }
    })
}

Когда я звоню из другого класса, я делаю что-то вроде этого:

et.setOnTextChangedListener(object : OnTextChangedListener {
    override fun onTextChanged(charSequence: CharSequence?, start: Int, before: Int, count: Int) {
        foo()
    }
})

Это работает, но я бы хотел что-нибудь почище ... с лямбдой, наверное.

Есть идеи? : -)

1 Ответ

0 голосов
/ 04 мая 2018

Вы можете передать лямбда-выражение, совпадающее с сигнатурой метода onTextChange, и переадресовывать на него любые вызовы слушателя:

fun EditText.setOnTextChangedListener(onTextChanged: (charSequence: CharSequence?, start: Int, before: Int, count: Int) -> Unit) {
    addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        }

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            onTextChanged(s, start, before, count)
        }

        override fun afterTextChanged(s: Editable?) {
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...