首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"onTextChanged()“返回旧的EditText文本值

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

Stack Overflow用户
提问于 2019-11-19 19:56:20
回答 1查看 904关注 0票数 0

我有一个应该返回EditText文本当前更新值的方法。但是,由于某种原因,为了使它一开始实际工作,输入必须更改2次。并且,当它返回时,它返回前一个值,而不是当前的值。

代码语言:javascript
运行
复制
fun EditText.text(): String {
    var whatever = text.toString()
    doOnTextChanged { text, _, _, _ -> whatever = text.toString() }

    return whatever
}

我不知道我是否说得很清楚,但我已经尝试了很长一段时间,但都没有成功。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-19 22:12:16

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

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

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

代码语言:javascript
运行
复制
fun EditText.text() = text.toString()

这并不是很有用,但是有效地执行了与原始函数相同的操作,减去了添加不必要的TextWatchers。

如果没有您所要做的工作的上下文,我就无法推荐如何修复您的项目。您的函数已经返回了最新更改的EditText值,但是您将其描述为该值是滞后的。我必须看到调用这个函数的代码,才能了解您想要做的事情。

我可以猜到也许你没有意识到String是不可变的。函数返回的字符串不会因为原来指向它的变量被指向其他东西而被更新。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58941920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档