美文网首页
实现一个可以设置最高价的Edittext

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

作者: 胖头鱼大大 | 来源:发表于2017-04-27 11: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

    相关文章

      网友评论

          本文标题:实现一个可以设置最高价的Edittext

          本文链接:https://www.haomeiwen.com/subject/ofjwzttx.html