我有一个方法应该返回EditText文本的当前更新值。但是,由于某种原因,为了使其首先真正起作用,输入必须更改2次。并且,当返回时,它将返回上一个值,而不是当前值。
fun EditText.text(): String {
var whatever = text.toString()
doOnTextChanged { text, _, _, _ -> whatever = text.toString() }
return whatever
}
不知道我是否清楚自己的意思,但是一段时间以来我一直在尝试解决这一问题,但没有成功。
答案 0 :(得分:0)
您的whatever
变量没有超过您创建的函数的寿命。调用edit()
函数时,会发生以下情况:
whatever
,并在文本视图中为其分配了文本的当前值。whatever
的值,这是没有意义的操作,因为在TextWatcher处于活动状态时无法访问whatever
。whatever
的值。该值将与第1步中的值相同,因为还没有机会进行更改。当您多次调用函数时,您正在向TextView中添加多个无用的TextWatcher。您的功能也可能是
fun EditText.text() = text.toString()
并不是很有用,但是实际上可以执行与原始功能相同的事情,只是要添加不必要的TextWatchers。
在没有您要尝试做的事情的上下文中,我不建议您如何修复您的项目。您的函数已经返回了EditText的最新更改值,但是您将其描述为好像值滞后了。我必须在调用此函数的地方查看代码,以了解要执行的操作。
我可以猜测,也许您没有意识到字符串是不可变的。您的函数返回的字符串不会得到更新,仅仅是因为最初指向它的变量被指向其他东西。
如果您希望在文本更改时发生某些事情,请将操作直接放在lambda中。在TextWatcher中,仅更新变量没有太多意义,因为始终可以直接从TextView中直接检索文本的最新值。