"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()
函数时发生的情况:
- 创建了一个变量
whatever
并赋予了文本视图中文本的当前值。
- 创建了一个新的 TextWatcher 并将其添加到 TextView。此 TextWatcher 在文本更改时更新
whatever
的值,这是一个毫无意义的操作,因为在 TextWatcher 处于活动状态时无法访问 whatever
。
- 返回
whatever
的值。它将与步骤 1 中的值相同,因为还没有机会更改它。
当您多次调用您的函数时,您正在向您的 TextView 添加多个无用的 TextWatcher。你的功能也可以是
fun EditText.text() = text.toString()
这不是很有用,但有效地完成了与原始函数相同的事情,只是添加了不必要的 TextWatchers。
如果没有确切了解您正在尝试做的事情,我无法推荐如何修复您的项目。您的函数已经 returns EditText 的最新更改值,但您将其描述为该值滞后。我必须查看您调用此函数的代码才能了解您要执行的操作。
我猜你可能没有意识到字符串是不可变的。函数返回的字符串不会更新,只是因为最初指向它的变量被指向了其他东西。
如果您希望在文本更改时发生某些事情,请将操作直接放在您的 lambda 中。简单更新变量的 TextWatcher 没有多大意义,因为无论如何始终可以直接从 TextView 检索文本的最新值。
我有一个方法应该return EditText 文本的当前更新值。但是,出于某种原因,为了让它一开始真正起作用,输入必须改变 2 次。而且,当它出现时,它 return 是以前的值,而不是当前值。
fun EditText.text(): String {
var whatever = text.toString()
doOnTextChanged { text, _, _, _ -> whatever = text.toString() }
return whatever
}
不知道我说清楚没有,我一直在尝试解决这个问题,但没有成功。
您的 whatever
变量不会超过您创建的函数。以下是调用 edit()
函数时发生的情况:
- 创建了一个变量
whatever
并赋予了文本视图中文本的当前值。 - 创建了一个新的 TextWatcher 并将其添加到 TextView。此 TextWatcher 在文本更改时更新
whatever
的值,这是一个毫无意义的操作,因为在 TextWatcher 处于活动状态时无法访问whatever
。 - 返回
whatever
的值。它将与步骤 1 中的值相同,因为还没有机会更改它。
当您多次调用您的函数时,您正在向您的 TextView 添加多个无用的 TextWatcher。你的功能也可以是
fun EditText.text() = text.toString()
这不是很有用,但有效地完成了与原始函数相同的事情,只是添加了不必要的 TextWatchers。
如果没有确切了解您正在尝试做的事情,我无法推荐如何修复您的项目。您的函数已经 returns EditText 的最新更改值,但您将其描述为该值滞后。我必须查看您调用此函数的代码才能了解您要执行的操作。
我猜你可能没有意识到字符串是不可变的。函数返回的字符串不会更新,只是因为最初指向它的变量被指向了其他东西。
如果您希望在文本更改时发生某些事情,请将操作直接放在您的 lambda 中。简单更新变量的 TextWatcher 没有多大意义,因为无论如何始终可以直接从 TextView 检索文本的最新值。