项目篇|EditText动态添加.00

261 阅读2分钟

因为之前做过这个需求,但是总是忘记了,现在打算把碰到的常用的需求,写成博客,这样下次有类似的需求就可以直接拿来看了,没必要再造轮子


需求:

当用户在输入框中输入金额时,后面自动带上.00


分析:

看上去挺简单的一个需求,但一操作下去,程序卡死了好几次,差点被炒鱿鱼了,这可不行,那我得看看源码,好好分析一波

TextWatcher类

大家都懂,addTextChangedListener就能监听到编辑框的内容

那么再看看这个接口TextWatcher的定义吧

beforeTextChanged(CharSequence s, int start,int count, int after)

onTextChanged(CharSequence s, int start, int before, int count)

afterTextChanged(Editable s)

大概的看一下,这里就不把全部源码弄出来了,可以去自行去看看。

beforeTextChanged() onTextChanged() 的方法 说了这一句,就是不能在这里修改s的值

It is an error to attempt to make changes to <code>s</code> from this callback.      

afterTextChanged() 方法说了这一句 ,可以修改s的,但是要注意使用,不然可能会造成死循环,这不说的就是我嘛,搞得我差点就要去卖炒粉了。

小发现

Spanable改变样式,试了下,用法跟Tv差不多,但是没有发现可以插入文本的,文本内容不可变 ,Span 可以自己去了解下,类似填词之类的需求可以用到

自造

根据上面的分析,beforeTextChanged onTextChanged 不建议修改,那老大都这么说了,那小弟只能这么做了 那么我就在afterTextChanged()中做文章吧

拿到一个需求,首先需要考虑清楚,有个设计,再开发。逻辑性是程序员必不可少的东西 你先要考虑可能出现的情况,比如

  • 如果只有.00,需要什么处理,
  • 光标的位置,需要怎么变化
  • 0是第一位的时候,第二是数字,应该怎么做,
  • 当用户删除小数点后一位时,是否需要补全,会造成无法输入小数点后第二位的情况
  • 0.00允许吗

代码如下

        if (s.contains(".")) {
                     val indexOf = s.indexOf(".")
        
                     if (s.length == 3 && indexOf ==0) {
                         et.setText("")
                         return
                     }

                     if (indexOf>=2&&s.subSequence(0,1).toString()=="0"){
                         s = s.subSequence(1,
                             s.length).toString()

                         et.setText(s)
                         et.setSelection(s.indexOf("."))
                     }
                     // 判断小数点后只能输入两位
                     if (s.length - 1 - indexOf > 2) {
                         //去除小数点后面三位的数字
                         s = s.subSequence(0,
                             indexOf.plus(3)
                         ).toString()
                         et.setText(s)
                         et.setSelection(s.length)
                     }

                } else {
                    if (s.isNotEmpty()) {
                        et.setText("$s.00")
                        et.setSelection(s.length)
                    }
        }

逻辑不难,好记性不如烂笔头

如果读的不对,要留言给我指出哦,我是个菜鸟,但有好学的心,加油!!!

我有个小花店,我不是来打广告的,看看无妨,这里只是多了个选礼物的地方