为了账号安全,请及时绑定邮箱和手机立即绑定

在文本更改侦听器上的android

在文本更改侦听器上的android

慕仙森 2019-08-02 15:34:58
在文本更改侦听器上的android我有一种情况,那里有两个领域。field1和field2。改变后我想做的就是空的field2,field1反之亦然。所以最后只有一个字段有内容。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等等......有人建议任何解决方案?
查看完整描述

3 回答

?
交互式爱情

TA贡献1712条经验 获得超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 这里的文档。

另外请尊重命名约定


查看完整回答
反对 回复 2019-08-02
?
翻阅古今

TA贡献1780条经验 获得超5个赞

我知道这已经过时了,但总有一天会有人再遇到这个问题。

我有一个类似的问题,我会在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();
   }
  });


查看完整回答
反对 回复 2019-08-02
?
RISEBY

TA贡献1856条经验 获得超5个赞

如果您使用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) {}
    })


查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 441 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信