Android-覆盖onTextChanged不会';不要改变行为
我正在尝试创建一个自定义EditText,它将在执行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
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实现,您的视图有两个侦听器。在您的情况下,两种实现都是不同的。延迟不会影响其他侦听器的执行