【问题标题】:Clear EditText text after adding onTextChanged implemenation添加 TextChanged 实现后清除 EditText 文本
【发布时间】:2011-04-06 13:45:43
【问题描述】:

我正在向 EditText 字段添加一个侦听器,以便将数字实时格式化为货币。

        loanText.addTextChangedListener(new TextWatcher() {
        private String current = "";
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(!s.toString().equals(current)){
               String cleanString = s.toString().replaceAll("[$,.]", "");

               double parsed = Double.parseDouble(cleanString);
               String formated = NumberFormat.getCurrencyInstance().format((parsed/100));

               current = formated;
               loanText.setText(formated);
               loanText.setSelection(formated.length());
            }
        }
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }
    });

但是,当我尝试清除 EditView 字段时,我的应用程序会崩溃。此外,退格键不再起作用。

【问题讨论】:

  • 你能发布 logcat 的输出吗?我很好奇你得到的错误。由于无限循环,它可能是 NumberFormatError 或(不太可能?)ANR。
  • 尝试删除当前字符串并使用 if(s.toString().length() != 0) {}

标签: android android-layout


【解决方案1】:

问题是您的TextWatcher 看到您正在“清除”文本,因此向其回调方法(afterTextChangedbeforeTextChanged 等)发送请求。

我所做的只是删除TextWatcher,清除文本,然后将TextWatcherback 添加到EditText。这样一来,我的EditText 更改就不会被监听了。

您可能必须保留TextWatcher 的实例,而不是像您所做的那样内联它。这样你就不必每次想清除EditText时都创建一个

  1. loanText.removeTextChangedListener(yourTextWatcherObject);
  2. loanText.setText("");
  3. loanText.addTextChangedListener(yourTextWatcherObject);

【讨论】:

  • 我建议使用布尔变量来控制监听器是否应该做任何事情。
  • 它对我不起作用是否有示例代码或其他解决方案谢谢
【解决方案2】:

尝试使用 afterTextChanged 反而。我和另一个也有很多问题。

【讨论】:

    【解决方案3】:

    我发现这门课对我很有帮助: http://www.java2s.com/Code/Android/UI/ConvertinputvaluetoCurrencyinTextWatcher.htm

    希望这会为你们节省一些时间。

    【讨论】:

      【解决方案4】:
      public class MainActivity extends Activity {
      EditText et;
      TextWatcher tw;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          et=(EditText) findViewById(R.id.et);
      
           tw=new TextWatcher(){
              @Override
              public void beforeTextChanged(CharSequence s, int start, int count,
                      int after) {
              }
              @Override
              public void onTextChanged(CharSequence s, int start, int before,
                      int count) {
              }
              @Override
              public void afterTextChanged(Editable s) {
                  et.removeTextChangedListener(tw);
                  et.setText(Math.random()+"");//add your logic here 
                  et.addTextChangedListener(tw);
              }};
              et.addTextChangedListener(tw);
      }   
      

      } 这是一个简单的解决方案。

      【讨论】:

        【解决方案5】:

        可以如下检查onTextChanged中的Text是否为空,如果为空则什么都不做

        s.toString().isEmpty()

        public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(!s.toString().equals(current) && !s.toString().isEmpty()){
                   String cleanString = s.toString().replaceAll("[$,.]", "");
        
                   double parsed = Double.parseDouble(cleanString);
                   String formated = NumberFormat.getCurrencyInstance().format((parsed/100));
        
                   current = formated;
                   loanText.setText(formated);
                   loanText.setSelection(formated.length());
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-31
          • 2018-02-24
          相关资源
          最近更新 更多