“ onTextChanged()”返回旧的EditText文本值

时间:2019-11-19 19:56:20

标签: android kotlin android-edittext

我有一个方法应该返回EditText文本的当前更新值。但是,由于某种原因,为了使其首先真正起作用,输入必须更改2次。并且,当返回时,它将返回上一个值,而不是当前值。

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

    return whatever
}

不知道我是否清楚自己的意思,但是一段时间以来我一直在尝试解决这一问题,但没有成功。

1 个答案:

答案 0 :(得分:0)

您的whatever变量没有超过您创建的函数的寿命。调用edit()函数时,会发生以下情况:

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

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

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

并不是很有用,但是实际上可以执行与原始功能相同的事情,只是要添加不必要的TextWatchers。

在没有您要尝试做的事情的上下文中,我不建议您如何修复您的项目。您的函数已经返回了EditText的最新更改值,但是您将其描述为好像值滞后了。我必须在调用此函数的地方查看代码,以了解要执行的操作。

我可以猜测,也许您没有意识到字符串是不可变的。您的函数返回的字符串不会得到更新,仅仅是因为最初指向它的变量被指向其他东西。

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