实现一个可以设置最高价的Edittext

2017-04-27  本文已影响0人  胖头鱼大大

这两天产品有一个需求。

价格.jpg

左右都是editText

最低价价格有上限,价格不能高于最高价。

自定义一个customeEditText继承EditText,实现一个inputFilter
inputFilter对插入的值进行检查,
如果合法,return null
如果不合法 retrun ""

this.setFilters(new InputFilter[]{moneyInputFilter, new   
InputFilter.LengthFilter(LENGTH)});
  private InputFilter moneyInputFilter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            String inputStr = dest.toString() + source.toString();
            int inputInt = NumberUtils.parseStrToInt(inputStr);
            if (maxValue < inputInt) {
                return "";
            }
            return null;
        }
    }; 
source start end dest dstart dend
要插入到edittext里的字符 插入字符开始位置,0开始 插入字符结束位置 edittext里已经有的字符 edittext里光标的开始位置 edittext里光标结束的位置

dstart和dend的含义,inputfilter里的说明我没看懂。经我测试后,大部分情况下这两个值是相同的。在按删除的时候dstart比dend值小1

endinput.gif

用户在数值末尾输入,能对数值正常检查

middleinput.gif

假如用户光标移动到中间再输入一个5,5545,大于最大值5455,(这里的示意图逻辑我已经处理过)如果按照上面的逻辑,这个5会被加到末尾,数值是5455,仍然可以输入的。但是这明显不符合需求

修改逻辑

 private InputFilter moneyInputFilter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            StringBuilder sb = new StringBuilder(dest);
            sb.insert(dstart, source);
            int inputInt = NumberUtils.parseStrToInt(sb.toString());
            if (maxValue < inputInt) {
                ToastMaster.show(getContext(),"输入价格超出了最大价格");
                return "";
            }
            return null;
        }
    };

这种方式,将用户输入的值插入到光标位置,再进行数值检查。
测试了几种情况,是满足需求的。

然而,加了这个inputFilter以后,再设置maxLength,不管用了。
需要自己增加length的filter

 this.setFilters(new InputFilter[]{moneyInputFilter, new InputFilter.LengthFilter(LENGTH)});

冲突的原因 http://www.jianshu.com/p/92f51642d59f

上一篇 下一篇

猜你喜欢

热点阅读