首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >android on Text Change Listener

android on Text Change Listener
EN

Stack Overflow用户
提问于 2013-12-29 19:23:18
回答 10查看 486.5K关注 0票数 322

我有一个情况,其中有两个字段。field1field2。我所要做的就是在field1更改时为空field2,反之亦然。所以最后只有一个字段有内容。

代码语言:javascript
复制
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,依此类推……

有人能给出什么解决方案吗?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-12-29 19:28:11

您可以添加复选标记,仅当字段中的文本不为空时(即长度不为0时)才清除。

代码语言:javascript
复制
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 here的文档。

也请尊重naming conventions

票数 529
EN

Stack Overflow用户

发布于 2016-07-16 10:38:20

我知道这很古老,但总有一天会有人再遇到它。

我遇到过一个类似的问题,我会在EditText上调用setText,当我不想调用onTextChanged时,它会被调用。我的第一个解决方案是在调用setText()之后编写一些代码来消除侦听器造成的破坏。但这并不是很优雅。在做了一些研究和测试后,我发现使用getText().clear()清除文本的方式与使用setText("")的方式很相似,但由于它没有设置文本,所以不会调用侦听器,所以我的问题就解决了。我把我所有的setText("")调用都切换到了getText().clear(),我不再需要胶布了,所以也许这也能解决你的问题。

试试这个:

代码语言:javascript
复制
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();
   }
  });
票数 25
EN

Stack Overflow用户

发布于 2018-06-25 15:04:56

如果你使用Kotlin进行Android开发,那么你可以使用以下代码添加TextChangedListener()

代码语言:javascript
复制
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) {}
    })
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20824634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档