我有2个editTexts。修改editText1时,editText2的内容将等于editText1 *5。修改editText2时,editText1的内容将等于editText2 *5。
现在,如果我使用addTextChangedListener()
,它会循环运行,因为editTexts内容将始终更改,从而导致崩溃。我需要检测editText是由用户还是通过编程方式进行修改。
有什么主意吗?
如果可以帮助,这是我的代码:
fun EditText.doubleValue() = text.toString().toDoubleOrNull() ?: 0.0
editText1.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun afterTextChanged(editable: Editable) {
editText2.setText(editText1.doubleValue() * 5)
}
})
editText2.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun afterTextChanged(editable: Editable) {
editText1.setText(editText2.doubleValue() * 5)
}
})
编辑:已解决
我使用if(editText.isFocused)
检查用户是否更改了
答案 0 :(得分:1)
您可以将TextWatchers保存在变量中,在以编程方式更改每个TextView
的内容之前将其删除,然后再次添加它们。
class MyActivity: AppCompatActivity() {
private val textWatcher1 = object : TextWatcher {
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun afterTextChanged(editable: Editable) {
updateEditText2()
}
}
fun EditText.doubleValue() = text.toString().toDoubleOrNull() ?: 0.0
private val textWatcher2 = object : TextWatcher {
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun afterTextChanged(editable: Editable) {
updateEditText1()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
editText1.addTextChangedListener(textWatcher1)
editText2.addTextChangedListener(textWatcher2)
}
private fun updateEditText1() {
editText1.removeTextChangedListener(textWatcher1)
editText1.setText(editText2.doubleValue() * 5)
editText1.addTextChangedListener(textWatcher1)
}
private fun updateEditText2() {
editText2.removeTextChangedListener(textWatcher2)
editText2.setText(editText1.doubleValue() * 5)
editText2.addTextChangedListener(textWatcher2)
}
}
答案 1 :(得分:0)
我认为您最好的选择是使用actionDone ime选项。这样,仅当用户完成字段编辑时,其他编辑文本才会更新。
为此,您需要将android:imeOptions="actionDone"
添加到您的editText xml el元素中。然后在您的代码中,而不是侦听更改,您将添加一个动作侦听器:
editText1.setOnEditorActionListener() { v, actionId, event ->
if(actionId == EditorInfo.IME_ACTION_DONE){
editText2.setText(editText1.doubleValue() * 5)
true
} else {
false
}
}
在不知道您的用例的情况下,我不知道此解决方案是否适合您。如果您需要实时更新editTexts,也许检查字段是否在焦点上可以防止无限循环:
editText1.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun afterTextChanged(editable: Editable) {
if(editText1.hasFocus()) {
editText2.setText(editText1.doubleValue() * 5)
}
}
})
答案 2 :(得分:0)
首先,删除功能 return el.title.toUpperCase().match(this.search.toUpperCase())
&& el.employmentType.toUpperCase().match(this.selectedJobType.toUpperCase())
&& el.customText12.toUpperCase().match(this.selectedLocation.toUpperCase())
&& el.dateAdded >= this.checkedDate
&& (this.checkedServiceAreas.length === 0 ||
this.checkedServiceAreas.includes(el.categories.data.map(({name}) => name).join(' '))));
,该功能不起作用(或者至少我无法使其起作用)。
使用2个布尔变量doubleValue()
和from1
,指示即将完成的更改来自代码,并在观察程序中检查其值。
假设您在from2
中输入。
editText1
的文本监视程序在更改editText1
的值之前会设置editText2
。
当from1 = true
的文本更改时,editText2
的文本监视程序将检查editText2
的值,并且由于它是from1
而不执行任何操作,因此仅设置true
。>
from1 = false