我有一个带有侦听器的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));
        }

最佳答案

在实现所需的功能之前,这里需要解决一些问题。


每当您处理TextWatcher时,在设置要监视的EditText对象的文本时都需要小心。这样做的原因是,每次您在其上调用setText时,它将再次触发监视程序,从而使您的代码进入无限循环。

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

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

应该将其更改为两倍以产生0.02等值。

进行这些更改之后,我们可以使EditText输入2后显示$ 0.02。但是由于我们已在代码中设置了EditText的值,因此下一个EditText项将添加到文本的开头。然后,如果我们输入“ 5”,我们将获得$ 50.02。

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



这是最终的解决方案:

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());
        }
    }
});

09-10 05:57
查看更多