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

时间:2018-10-31 12:45:28

标签: kotlin android-edittext

我有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)检查用户是否更改了

3 个答案:

答案 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