在文本更改侦听器上的android

在文本更改侦听器上的android

我有一种情况,那里有两个领域。field1field2。改变后我想做的就是空的field2field1反之亦然。所以最后只有一个字段有内容。

field1 = (EditText)findViewById(R.id.field1);field2 = (EditText)findViewById(R.id.field2);field1.addTextChangedListener(new TextWatcher() {

   public void afterTextChanged(Editable s) {}

   public void beforeTextChanged(CharSequence s, int start,
     int count, int after) {
   }

   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
      field2.setText("");
   }
  });field2.addTextChangedListener(new TextWatcher() {

   public void afterTextChanged(Editable s) {}

   public void beforeTextChanged(CharSequence s, int start,
     int count, int after) {
   }

   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
     field1.setText("");
   }
  });

如果我只附加addTextChangedListener,它工作正常field1,但当我为两个字段执行时,应用程序崩溃。显然是因为他们试图无限期地互相改变。一旦field1改变它field2在此时 清除field2就会改变,所以它会清除field1等等......

有人建议任何解决方案?


慕仙森
浏览 442回答 3
3回答

交互式爱情

您可以添加检查以仅清除字段中的文本不为空时(即长度不是0时)。field1.addTextChangedListener(new TextWatcher() {    @Override    public void afterTextChanged(Editable s) {}    @Override        public void beforeTextChanged(CharSequence s, int start,      int count, int after) {    }    @Override        public void onTextChanged(CharSequence s, int start,      int before, int count) {       if(s.length() != 0)         field2.setText("");    }   });field2.addTextChangedListener(new TextWatcher() {    @Override    public void afterTextChanged(Editable s) {}    @Override    public void beforeTextChanged(CharSequence s, int start,      int count, int after) {    }    @Override    public void onTextChanged(CharSequence s, int start,      int before, int count) {       if(s.length() != 0)          field1.setText("");    }   });TextWatcher 这里的文档。另外请尊重命名约定。

翻阅古今

我知道这已经过时了,但总有一天会有人再遇到这个问题。我有一个类似的问题,我会在EditText上调用setText,当我不想要它时会调用onTextChanged。我的第一个解决方案是在调用setText()之后编写一些代码以撤消侦听器所造成的损坏。但那并不是很优雅。在做了一些研究和测试后,我发现使用getText()。clear()以与setText(“”)大致相同的方式清除文本,但由于它没有设置文本,因此不调用监听器,因此解决了我的问题。我将所有的setText(“”)调用切换到getText()。clear(),我不再需要绷带了,所以也许这也可以解决你的问题。试试这个:Field1 = (EditText)findViewById(R.id.field1);Field2 = (EditText)findViewById(R.id.field2);Field1.addTextChangedListener(new TextWatcher() {    public void afterTextChanged(Editable s) {}    public void beforeTextChanged(CharSequence s, int start,      int count, int after) {    }    public void onTextChanged(CharSequence s, int start,      int before, int count) {       Field2.getText().clear();    }   });Field2.addTextChangedListener(new TextWatcher() {    public void afterTextChanged(Editable s) {}    public void beforeTextChanged(CharSequence s, int start,      int count, int after) {    }    public void onTextChanged(CharSequence s, int start,      int before, int count) {      Field1.getText().clear();    }   });

RISEBY

如果您使用Kotlin进行Android开发,那么您可以TextChangedListener()使用以下代码添加:myTextField.addTextChangedListener(object : TextWatcher{         override fun afterTextChanged(s: Editable?) {}         override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}         override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}     })
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
Android