您的位置:首页 > 其它

EditText 使用TextWatcher接口输入有效值(数值或金额)

2018-01-05 13:34 561 查看
数据上传到服务器,需要对数据的值进行限制,EditText在输入时做限制。使用TextWatcher接口。

可以限制小数点前位数和小数点后位数 。

public class MyWatcher implements TextWatcher{

    private int beforeDot;

    private int afterDot;

    private int cursor=0;//记录光标的位置

    /**

     * 构造器

     *

     * @param beforeDot 小数点前位数   不限制输入-1

     * @param afterDot  小数点后位数   不限制输入-1

     */

    public MyWatcher(int beforeDot, int afterDot) {

        this.beforeDot = beforeDot;

        this.afterDot = afterDot;

    }

    @Override

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override

    public void onTextChanged(CharSequence s, int start, int before, int count) {

        cursor = start;

    }

    @Override

    public void afterTextChanged(Editable s) {

            judge(s);

    }

    private void judge(Editable editable) {

        String temp = editable.toString();

        int posDot = temp.indexOf(".");//小数点的位置

        //直接输入小数点的情况

        if (posDot == 0) {

            editable.insert(0, "0");

            return;

        }

        //输入-.的情况

        if (temp.startsWith("-")&&posDot == 1){

            editable.insert(1, "0");

            return;

        }

        if (cursor!=0){

            if (temp.length()>cursor){

                String s = temp.substring(cursor,cursor+1);

                if (s.equals("-")){//不是首位时输入"-"

                    editable.delete(cursor,cursor+1);

                    return;

                }

                if (cursor!=temp.indexOf(".")){

                    if (s.equals(".")){//已有"."后在输入"."

                        editable.delete(cursor,cursor+1);

                        return;

                    }

                }else{

                    String substring = temp.substring(temp.indexOf(".")+1, temp.length());

                    if (substring.contains(".")){//已有"."前在输入"."

                        editable.delete(temp.indexOf(".")+substring.indexOf("."),temp.indexOf(".")+substring.indexOf(".")+1);

                        return;

                    }

                }

            }

        }

        //输入"08" 等类似情况

        if (temp.startsWith("0") && temp.length() > 1 && (posDot == -1 || posDot > 1)) {

            editable.delete(0, 1);

            return;

        }
//输入"-08" 等类似情况

        if (temp.startsWith("-0") && temp.length() > 2 && (posDot == -1 || posDot > 2)) {

            editable.delete(1, 2);

            return;

        }

      if (posDot < 0 && beforeDot != -1) {

            //不包含小数点 限制小数点前位数,含"-" 位数加1

            if (temp.startsWith("-")) {

                if (temp.length() > beforeDot+1) {

                    editable.delete(beforeDot, beforeDot + 1);

                }

            }else{

                if (temp.length() > beforeDot) {

                     editable.delete(beforeDot, beforeDot + 1);

                }

            }

            return;

        }else if (posDot > 0 && beforeDot != -1){
 //包含小数点 限制小数点前位数 含"-" 位数加1

            if (temp.startsWith("-")){

                if (posDot>beforeDot+1){

                    editable.delete(cursor, cursor + 1);

                }

            }else{

                if (posDot>beforeDot){

                    editable.delete(cursor, cursor + 1);

                }

            }

        }

    

        //如果包含小数点 限制小数点后位数

        if (temp.length() - posDot - 1 > afterDot && afterDot != -1) {

            editable.delete(posDot + afterDot + 1, posDot + afterDot + 2);//删除小数点后多余位数

        }

    }
}

注册监听:

EditText mEditor = (EditText)findViewById(R.id.editor_input);

mEditor.addTextChangedListener(mTextWatcher);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: