实时过滤输入?

时间:2011-02-25 00:46:05

标签: java android

我有一个带有监听器的EditText(接受0-9)。我想在输入时抓取输入,应用计算,并在同一个EditText框中显示它。

该框最初显示0.00美元。当用户输入2时,我想从框中抓取它,解析它以删除$和小数,将其转换为int ...除以100并在其前面放一个$。在setText之后,它应该显示$ 0.02。如果他们然后按5,我会抓住它,解析它,最后得25,做数学,它应该显示0.25美元等。

我不知道这是不是最好的方式,我对新想法持开放态度。这是我目前的代码:

mEditPrice.addTextChangedListener(new TextWatcher(){
        DecimalFormat dec = new DecimalFormat("0.00");
        @Override
        public void afterTextChanged(Editable arg0) {
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start,
                int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start,
                int before, int count) {
            String userInput = mEditPrice.getText().toString().replaceAll("[^\\d]", "");
            int userInputInt = Integer.parseInt(userInput);
            mEditPrice.setText("$"+dec.format(userInputInt / 100));
        }

1 个答案:

答案 0 :(得分:1)

在您实现所需的功能之前,有一些问题需要处理。

  1. 每当您处理TextWatcher时,在设置正在观看的EditText对象的文本时都需要小心。原因是每次调用setText时,它都会再次触发观察者,导致代码进入无限循环。

    要防止这种情况,您应该将要设置的文本值设置为onTextChanged方法之外的变量。输入方法时,请检查此变量,并仅在值与CharSequence不同时执行处理代码

  2. 整数变量userInputInt除以100时将等于零。

    应将其更改为double以生成0.02等值

  3. 在这些更改之后,我们可以在输入2之后让EditText显示$ 0.02。但是因为我们在代码中设置了EditText的值,所以EditText的下一个条目将被添加到文本的开头。然后,如果我们输入'5',我们得到$ 50.02。

    为了解决这个问题,我们需要做的最后一件事是使用set position方法将EditText的位置设置为字符串的结尾。

  4. 这是最终的解决方案:

    private String value;
    
    mEditPrice.addTextChangedListener(new TextWatcher(){
        DecimalFormat dec = new DecimalFormat("0.00");
    
        @Override
        public void afterTextChanged(Editable arg0) {
        }
    
        @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.toString().equals(value)){
                String userInput = mEditPrice.getText().toString().replaceAll("[^\\d]", "");
                double userInputDouble = Double.parseDouble(userInput);
                value = ("$"+dec.format(userInputDouble / 100));
    
                mEditPrice.setText(value);
                mEditPrice.setSelection(value.length());
            }
        }
    });