自定义一个控制输入小数或整数的位数的EditText

需求:要求可以最多输入4位整数,并且小数部分最多输入2位,也就是xxxx.xx类型的字符串,中间包含很多组合比如xxx.x或者xx.xx等等,所以为了方便下一次使用决定自定义一个Edittext。

思路:监听输入框的字符输入,符合要求则显示,不符合要求则显示上一次的字符

废话不多说直接上代码:

1,自定义的EditText:

public class FloatEditTextView extends EditText implements TextWatcher {
    private String lastNumber;
    private Context context;
    private int integer_part;    //整数部分
    private int decimal_part;    //小数部分

    public FloatEditTextView(Context context) {
        this(context,null);
    }

    public FloatEditTextView(Context context, AttributeSet attrs) {
        this(context, attrs,android.R.attr.editTextStyle);
    }

    public FloatEditTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context =context;
        init(attrs);
    }
    private void init(AttributeSet attrs) {
        TypedArray typedArray = context.getTheme().obtainStyledAttributes(
                attrs,
                R.styleable.FloatEditTextView,
                0, 0);
        setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);
        integer_part =typedArray.getInteger(R.styleable.FloatEditTextView_integer_part,1);
        decimal_part =typedArray.getInteger(R.styleable.FloatEditTextView_decimal_part,1);

        if(integer_part>0&&decimal_part>0) {
            addTextChangedListener(this);
        }
    }

    @Override
    public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        lastNumber = s.toString();
    }

    @Override
    public void afterTextChanged(Editable s) {
        String temp = s.toString();
        int posDot = temp.indexOf(".");
        if (Pattern.matches("^[0-9]{1,"+integer_part+"}(\\.[0-9]{1,"+decimal_part+"})?$",temp)) {
            if(temp.startsWith("0")&&!temp.equals("0")){
                if(posDot>1||posDot<0){
                    setText(temp.substring(1));
                    setSelection(getText().length());
                }
            }
        }else {
            if (temp.endsWith(".")) {
                if (temp.length() == 1) {
                    setText("0.0");
                    return;
                }
                if (temp.length() < lastNumber.length()) {
                    String str = temp.substring(0, temp.length() - 1);
                    setText(str);
                    setSelection(getText().length());
                    return;
                } else {
                    return;
                }
            } else if (temp.startsWith(".")) {
                setText(temp.substring(1, getText().length()));
                return;
            } else {
                if (!TextUtils.isEmpty(temp)&&temp!=lastNumber) {
                    setText(lastNumber);
                    setSelection(getText().length());
                }
            }
        }
    }

    /**
     * 输入框编辑状态
     */
    public void setEditable(boolean flag) {
        setFocusable(flag);
        setFocusableInTouchMode(flag);
    }

}
2.资源文件中定义自己需要的属性,这里也就是使用过程中需要传递的参数,
integer_part
代表整数部分的位数,
decimal_part
代表小数部分的位数

<declare-styleable name="FloatEditTextView">
    <attr name="integer_part" format="integer"></attr>
    <attr name="decimal_part" format="integer"></attr>
</declare-styleable>
3.使用该自定义的view

<com.view.FloatEditTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/common_black"
    android:textSize="16sp"
    android:background="@null"
    myView:integer_part="4"
    myView:decimal_part="2"
    />
这里两个参数分别传了4和2也就是最多整数4位,小数2位,分享至此就结束了,这个过程中,最关键的还是正则表达式的书写,做出准确的判断,如果各位还有更好的办法,欢迎分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值