"onTextChanged()" 返回旧的 EditText 文本值

"onTextChanged()" returning old EditText text value

我有一个方法应该return EditText 文本的当前更新值。但是,出于某种原因,为了让它一开始真正起作用,输入必须改变 2 次。而且,当它出现时,它 return 是以前的值,而不是当前值。

fun EditText.text(): String {
    var whatever = text.toString()
    doOnTextChanged { text, _, _, _ -> whatever = text.toString() }

    return whatever
}

不知道我说清楚没有,我一直在尝试解决这个问题,但没有成功。

您的 whatever 变量不会超过您创建的函数。以下是调用 edit() 函数时发生的情况:

  1. 创建了一个变量 whatever 并赋予了文本视图中文本的当前值。
  2. 创建了一个新的 TextWatcher 并将其添加到 TextView。此 TextWatcher 在文本更改时更新 whatever 的值,这是一个毫无意义的操作,因为在 TextWatcher 处于活动状态时无法访问 whatever
  3. 返回whatever的值。它将与步骤 1 中的值相同,因为还没有机会更改它。

当您多次调用您的函数时,您正在向您的 TextView 添加多个无用的 TextWatcher。你的功能也可以是

fun EditText.text() = text.toString()

这不是很有用,但有效地完成了与原始函数相同的事情,只是添加了不必要的 TextWatchers。

如果没有确切了解您正在尝试做的事情,我无法推荐如何修复您的项目。您的函数已经 returns EditText 的最新更改值,但您将其描述为该值滞后。我必须查看您调用此函数的代码才能了解您要执行的操作。

我猜你可能没有意识到字符串是不可变的。函数返回的字符串不会更新,只是因为最初指向它的变量被指向了其他东西。

如果您希望在文本更改时发生某些事情,请将操作直接放在您的 lambda 中。简单更新变量的 TextWatcher 没有多大意义,因为无论如何始终可以直接从 TextView 检索文本的最新值。