金额输入框 MoneyView

来源:互联网 发布:淘宝会员id在哪里查看 编辑:程序博客网 时间:2024/06/05 19:22

金额输入框 MoneyView

在我们开发APP的过程当中,各种各样的输入框,在之前的一篇博客中我写过一个可以自定义显示模板的EditText XEditText类,有需要的可以点击查看,今天就共享一个开发中也很常见的EditText输入框,那就是金额输入框。

GitHub 传送门 GitHub_MoneyView控件

废话不多说,上图效果展示:

MoneyView效果展示

主要功能

  1. 指定小数点后能保存的小数位数;
  2. 指定从多少位开始到最后不能为小数点;
  3. 当第一个输入的为小数点时,自动在小数点前面拼接 0,组成 0.的形式;
  4. 当第一个输入的为0时,如果接着输入0,仍然显示0;如果接着输入大于0的数,就用后面输入的数将0替换.

使用

1)使用代码指定属性

① 布局文件中指定控件

<com.renj.moneyview.weight.MoneyViewandroid:id="@+id/moneyview1"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_margin="12dp"    android:hint="输入金额,代码指定属性"    android:textColor="@color/colorPrimary" />

② 在代码中找到控件并设置属性

 MoneyView moneyView1 = (MoneyView) findViewById(R.id.moneyview1); moneyView1          .setMaxLength(7)          .setDecimalLength(3)          .setPointCannotPosition(5)          .setMoneyChangeListener(new MoneyView.MoneyChangeListener() {             @Override             public void afterTextChanged(Editable s) {                  Log.i("MainActivity", "afterTextChanged => " + s);             }          });

2)在布局文件中指定属性

直接在布局文件中指定就可以了,不需要在代码里进行指定属性就可以实现功能

<com.renj.moneyview.weight.MoneyView    android:id="@+id/moneyview2"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_margin="12dp"    android:hint="输入金额,xml中指定属性"    android:textColor="@color/colorPrimary"    app:decimal_length="2"    app:max_length="9"    app:point_cannot_position="8" />

自定义属性说明

<declare-styleable name="MoneyView">    <!--设置控件输入内容的最大长度,包含小数点,只有设置了这个属性时,在超出长度之后才会弹出Toast提示,    如果设置了系统的 android:maxLength 属性,那么在这个属性将失效,超过长度也不会弹出Toast提示。-->    <attr name="max_length" format="integer" />    <!--小数点后保持的位数,当小于等于0时,表示不控制小数点的位数-->    <attr name="decimal_length" format="integer" />    <!--指定从多少位开始到最后不能是小数点,当小于等于1时表示控制小数点的位置。 默认最后一位不能是小数点-->    <attr name="point_cannot_position" format="integer" /></declare-styleable>

核心代码

主要在EditText的监听回调方法中做相应的操作

// 设置监听    addTextChangedListener(new TextWatcher() {        @Override        public void beforeTextChanged(CharSequence s, int start, int count, int after) {            if (mMoneyChangeListener != null)                mMoneyChangeListener.beforeTextChanged(s, start, count, after);        }        @Override        public void onTextChanged(CharSequence s, int start, int before, int count) {            int currentLength = s.toString().length();            // 判断最大长度,如果在布局文件中是使用 android:maxLength="11" 属性设置了最大长度,这段代码将不会被执行            if (currentLength > mMaxLength) {                Toast.makeText(getContext(), "最大输入" + mMaxLength + "位数", Toast.LENGTH_SHORT).show();                getText().delete(currentLength - 1, currentLength);                currentLength = s.toString().length();            }            // 判断 mPointCannotPosition 值是否大于1            if (mPointCannotPosition > 1) {                // 判断 当前的长度和是否为不能是小数点的位置并比较当前位置是否为小数点                if (currentLength >= mPointCannotPosition && s.charAt(currentLength - 1) == '.') {                    Toast.makeText(getContext(), "第" + mPointCannotPosition + "位开始不能是小数点", Toast.LENGTH_SHORT).show();                    getText().delete(currentLength - 1, currentLength);                    currentLength = s.toString().length();                }            }            // 判断 mDecimalLength 值是否大于0            if (mDecimalLength > 0) {                // 计算小数点后面的位数, 判断 小数点后能保持的最大位数                if (s.toString().contains(".") && (s.length() - 1) - (s.toString().indexOf(".")) > mDecimalLength) {                    Toast.makeText(getContext(), "小数点后只能保持" + mDecimalLength + "位", Toast.LENGTH_SHORT).show();                    getText().delete(currentLength - 1, currentLength);                    currentLength = s.toString().length();                }            }            // 如果输入的第一位是点,那么就在前面加一个0            if (currentLength == 1 && s.charAt(0) == ('.')) {                getText().insert(0, "0");                currentLength = s.toString().length();            }            // 如果第一个输入的是0,那么后面再输入0就仍然是显示0,如果输入大于0的数就用后一个数将0代替,如果输入点就正常输入            if (s.toString().startsWith("0") && currentLength > 1) {                if (!s.toString().substring(1, 2).equals(".")) { // 以0开始并且第二位不是点                    CharSequence sequence = s.subSequence(1, currentLength);                    getText().clear();                    getText().append(sequence);                }            }            if (mMoneyChangeListener != null)                mMoneyChangeListener.onTextChanged(s, start, before, count);        }        @Override        public void afterTextChanged(Editable s) {            if (mMoneyChangeListener != null)                mMoneyChangeListener.afterTextChanged(s);        }    });
原创粉丝点击