【问题标题】:How can I use doOnTextChanged() without overriding textWatcher?如何在不覆盖 textWatcher 的情况下使用 doOnTextChanged()?
【发布时间】:2022-12-16 02:47:43
【问题描述】:

我不熟悉Android StudioKotlinJava的提示。他们中的大多数人让我作为 Android 的初学者感到困惑。例如,以下是什么意思?

doOnTextChanged(CharSequence, Int, Int, Int)

我知道在覆盖方法 (s:CharSequence, start: Int, before: Int, count: Int) 中,第一个是存储 textView 的当前文本的变量。但是如何在不覆盖的情况下在这里使用它呢?第二个是start,第三个是before,最后一个是覆盖方法中的count。但是我只知道s: CharSequence的作用,并不知道如何在覆盖方法中使用其他三个东西。

有没有这很容易解释这些基本概念?

【问题讨论】:

    标签: android kotlin default


    【解决方案1】:

    如果没有 Kotlin,您将不得不创建一个实现 TextWatcher 的类并覆盖 onTextChanged() 函数,以便能够在文本更改时对其做出反应。

    借助 Kotlin,Android Jetpack 提供了一个方便的带有 doOnTextChanged 的 TextView 扩展函数,它允许您使用 lambda 函数简单地对 TextView 的文本更改做出反应。

    如果没有 Kotlin 扩展函数,您将通过以下方式对文本更改做出反应:

    myTextView.addTextChangedListener(object: TextWatcher {
        override fun afterTextChanged(s: Editable) {} // do nothing
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} // do nothing
    
        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int)  {
            // This function is called each time text in the text view is changed
            // s is the current text. The other parameters tell you which characters are
            // changed since the last time the function was called.
    
            // Put code in here that you want to run each time there's a change.
        }
    })
    

    使用 Kotlin 扩展函数,它更简洁,因为您不必写出您不使用的额外函数:

    myTextView.doOnTextChanged { s, start, before, count ->
        // The code in this lambda function is called each time text in the text view is changed
    }
    

    Kotlin 文档对初学者来说不是很有用。它的编写就好像您已经熟悉至少一种面向对象的语言一样。 Java 文档对初学者更加友好。尽管语法不同,但有关基本面向对象概念的教学对 Kotlin 和面向对象编程的新手非常有帮助。 You can start here.这里使用的概念是接口.

    Java 没有扩展函数。这是 Kotlin 的一项功能,允许为类编写函数而无需覆盖任何内容。在这种情况下,Jetpack 作者使用此功能通过使用无法在 Java 7(Java Android 版本用于其标准代码库)中实现的功能为 Kotlin 用户提供更简洁的语法。如果 Android 是用 Java 8 或更高版本编写的,那么 TextWatcher 可以为两个不常用的函数提供默认的空实现,这样就不需要这个 Kotlin 扩展函数来提供简洁的语法。

    请注意,如果您查看此扩展函数的源代码,它实际上仍在覆盖 TextWatcher。它只是在幕后代表您这样做。

    【讨论】:

    • 感谢宝贵的帖子。正如我在帖子中所说,我的问题之一是我不知道 s, start, before, count -> 是什么来使用它们或在 Kotlin 扩展函数中作为输入输入!
    • 您应该查看相关 TextWatcher 函数的文档以了解它们的作用。 Jetpack 的扩展功能确实缺乏明确的文档。 developer.android.com/reference/android/text/… 不确定的时候,可以在Android Studio中Ctrl+click一个函数跳转到它的源码。在这种情况下,它会向您显示它正在使用 TextWatcher,因此您可以单击进入 TextWatcher 文档以了解它在做什么。
    • 抱歉再发表评论。感谢Ctrl+click。当我从 myTextView.doOnTextChanged { s, start, before, count 打印 text, start, before, count 时,我得到文本视图的文本,输入的字符数减去 1(从 0 开始)但是有点奇怪 before 是 0 如果 count 是 1,它是 1 如果count 是 0。为什么?您提供的网址没有帮助。
    • 嘿@Tenfour04 你好吗?抱歉,我正在向另一个问题帖子提问。你能帮我解决这个issue吗?谢谢
    • 嗨@vivekmodi,抱歉,我对蓝牙规范的经验为零。我不知道这是什么意思。
    【解决方案2】:

    其他方法做。

    在 gradle 中使用这个依赖

    实施 'androidx.core:core-ktx:latest_version'

    你可以简单地使用下面的代码。

    edit_text.addTextChangedListener { it: Editable? ->
      // Do your stuff here
    }
    

    或者

    edit_text.doOnTextChanged { text, start, count, after -> // Do stuff }
    

    说明:

    调用此方法是为了通知您,在 s 内,从 start 开始的 count 个字符刚刚替换了之前具有 length 的旧文本。尝试从此回调中更改 s 是错误的。

    供您参考:

    https://developer.android.com/reference/android/text/TextWatcher.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 2018-05-05
      • 2012-05-15
      • 2022-01-11
      相关资源
      最近更新 更多