kotlin - 检查 editText 内容是否已被用户或以编程方式修改

Arf*_*ann 1 android-edittext kotlin

我有 2 个编辑文本。当editText1被修改时,editText2的内容将等于editText1 * 5。当editText2被修改时,editText1的内容将等于editText2 * 5。

现在,如果我使用addTextChangedListener()它,它就会循环,因为 editTexts 内容会发生变化,总是导致崩溃。我需要检测 editTexts 是否被用户修改或以编程方式修改。

任何想法?

如果可以帮助的话,这是我的代码:

     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)
                }
            })
Run Code Online (Sandbox Code Playgroud)

编辑:已解决

我曾经if(editText.isFocused)检查用户是否更改了

pde*_*d59 5

您可以将 TextWatcher 保存在变量中,在以编程方式更改每个变量的内容之前删除它们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)
  }
}
Run Code Online (Sandbox Code Playgroud)