Android-覆盖onTextChanged不会';不要改变行为

Android-覆盖onTextChanged不会';不要改变行为,android,text,view,Android,Text,View,我正在尝试创建一个自定义EditText,它将在执行onTextChanged之前实现延迟 class CustomEditText(context: Context, attributeSet: AttributeSet) : AppCompatEditText(context, attributeSet) { private var millisDelay: Long = 500 private var timer: Timer? = null overr

我正在尝试创建一个自定义EditText,它将在执行onTextChanged之前实现延迟

class CustomEditText(context: Context, attributeSet: AttributeSet) : AppCompatEditText(context, attributeSet) {

     private var millisDelay: Long = 500

     private var timer: Timer? = null

     override fun onTextChanged(
         text: CharSequence?,
         start: Int,
         lengthBefore: Int,
         lengthAfter: Int
     ) {
         doDelay {
             Log.d("somekoder", "Calling onTextChanged after $millisDelay milliseconds")
             super.onTextChanged(text, start, lengthBefore, lengthAfter)
         }
     }

     fun setDelay(millisDelay: Long){
         this.millisDelay = millisDelay
     }

     private fun doDelay(then: () -> Unit){
         timer?.cancel()
         timer = Timer()
         // Log.d("somekoder", "Got action. Waiting $millisDelay milliseconds.")
         timer?.schedule(timerTask {
             then.invoke()
         }, millisDelay)
     }
}
这是我的主要活动

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        search.setDelay(1000)

        search.addTextChangedListener {
            Log.d("somekoder", "MainActivity: onTextChanged")
        }
    }
}
这就是我的日志的样子:

D/somekoder: MainActivity: onTextChanged
D/somekoder: MainActivity: onTextChanged
D/somekoder: MainActivity: onTextChanged
D/somekoder: MainActivity: onTextChanged
D/somekoder: Calling onTextChanged after 1000 milliseconds
调用MainActivity onTextChanged,即使其中有延迟。 有人能解释一下我做错了什么吗?
提前谢谢

onTextChanged
方法是一种受保护的方法,其工作原理类似于
TextView
子类的内部侦听器。默认实现是空的,在文本更改时和侦听器之后调用它。所以它完全独立于听众

如果您想延迟侦听器(而不是文本更改),可以这样做。但我不推荐它,因为我认为它可能会导致问题,尤其是在
后文本更改时(因为它可能会更改文本)

override fun addTextChangedListener(观察者:TextWatcher){
super.addTextChangedListener(对象:TextWatcher{
重写更改前文本(s:CharSequence?、开始:Int、计数:Int、结束:Int)之前的乐趣{
多德雷{
watcher.beforeTextChanged(s、start、count、after)
}
}
重写已更改的文本(s:CharSequence?,start:Int,before:Int,count:Int){
多德雷{
watcher.onTextChanged(s、开始、之前、计数)
}
}
覆盖后文本更改(s:可编辑?){
多德雷{
观察者。后文本已更改
}
}
})
}

使用addTextChangedListener()可以添加多个侦听器,而不像setOnclickListener那样一次只能设置一个侦听器。作为一个通用api实现,您的视图有两个侦听器。在您的情况下,两种实现都是不同的。延迟不会影响其他侦听器的执行