EditView金额校验

金额校验,保留一位小数

public class CashierInputFilter implements InputFilter {
        Pattern mPattern;
        //输入的最大金额
        private static final int MAX_VALUE = Integer.MAX_VALUE;
        //小数点后的位数
        private static final int POINTER_LENGTH = 1;
        private static final String POINTER = ".";
        private static final String ZERO = "0";

        public CashierInputFilter() {
            mPattern = Pattern.compile("([0-9]|\\.)*");
        }

        /**
         * @param source 新输入的字符串
         * @param start  新输入的字符串起始下标,一般为0
         * @param end    新输入的字符串终点下标,一般为source长度-1
         * @param dest   输入之前文本框内容
         * @param dstart 原内容起始坐标,一般为0
         * @param dend   原内容终点坐标,一般为dest长度-1
         * @return 输入内容
         */
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            String sourceText = source.toString();
            String destText = dest.toString();
            //验证删除等按键
            if (TextUtils.isEmpty(sourceText)) {
                return "";
            }

            Matcher matcher = mPattern.matcher(source);
            //已经输入小数点的情况下,只能输入数字
            if (destText.contains(POINTER)) {
                if (!matcher.matches()) {
                    return "";
                } else {
                    if (POINTER.equals(source)) {  //只能输入一个小数点
                        return "";
                    }
                }
                //验证小数点精度,保证小数点后只能输入1位
                int index = destText.indexOf(POINTER);
                int length = dend - index;
                if (length > POINTER_LENGTH) {
                    return dest.subSequence(dstart, dend);
                }
            } else {
                //没有输入小数点的情况下,只能输入小数点和数字,但首位不能输入小数点和0
                if (!matcher.matches()) {
                    return "";
                } else {
                    if ((POINTER.equals(source)) && TextUtils.isEmpty(destText)) {
                        return "";
                    }
                    //如果首位为“0”,则只能再输“.”
                    if (ZERO.equals(destText)) {
                        if (!POINTER.equals(sourceText)) {
                            return "";
                        }
                    }
                }
            }
            //验证输入金额的大小
            double sumText = Double.parseDouble(destText + sourceText);
            if (sumText > MAX_VALUE) {
                return dest.subSequence(dstart, dend);
            }
            return dest.subSequence(dstart, dend) + sourceText;
        }
    }

使用

// 加入数据过滤
InputFilter[] inputFilters = {new CashierInputFilter()};
targetEditView.setFilters(inputFilters);

TextView ImageSpan图片居中

TexView图文混排使用ImageSpan,发现里面的图片不能居中,查看源码只可以设置align_bottom与align_baseline.
并不能设置居中

    /**
     * A constant indicating that the bottom of this span should be aligned
     * with the bottom of the surrounding text, i.e., at the same level as the
     * lowest descender in the text.
     */
    public static final int ALIGN_BOTTOM = 0;
    
    /**
     * A constant indicating that the bottom of this span should be aligned
     * with the baseline of the surrounding text.
     */
    public static final int ALIGN_BASELINE = 1;

- 阅读剩余部分 -

Java Serializable serialVersionUID问题

前言:项目升级新版本时,保存在SharedPreferences中用户信息丢失了。升级上来调试的时候取不到值,log中也没有看到其它信息,先后查看了上来的文件都是存在的,于是定位到取值的方法上面,进过调试发现我取对象时出现(java.io.InvalidClassException: ...; local class incompatible: stream classdesc serialVersionUID = xxL, local class serialVersionUID = xxxL)异常。

SharedPreferences中保存User 我是以对象的方式保存的。

public void put(String key, Object ser, Cipher cipher) {
        try {
            Log.i(TAG, key + " put: " + ser);
            if(ser == null) {
                this.sp.edit().remove(key).commit();
            } else {
                byte[] e = ByteUtil.objectToByte(ser);
                if(cipher != null) {
                    e = cipher.encrypt(e);
                }

                this.put(key, HexUtil.encodeHexStr(e));
            }
        } catch (Exception var5) {
            var5.printStackTrace();
        }

    }

- 阅读剩余部分 -

Android的消息机制

Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。
Handler:消息的发送和接收。
MessageQueue:消息队列,它的内部存储了一组消息,以队列的形式对外提供插入和删除的工作,其内部存储结构是采用单链表的数据结构来存储消息列表的。
Looper:消息循环,扮演MessageQueue和Handler之间桥梁的角色,循环取出MessageQueue里面的Message,并交付给相应的Handler进行处理

- 阅读剩余部分 -