美文网首页
Android输入框格式化Edittexthelp(有项目可下载

Android输入框格式化Edittexthelp(有项目可下载

作者: 旺旺碎冰冰s | 来源:发表于2019-05-07 17:44 被阅读0次
Android银行卡、手机号、身份证格式化。不支持从中间删除,如果有人愿意完善一下,麻烦联系我,感谢。下载代码​​​​​​​​​​​​​​

 ```

public class SpaceTextWatcherimplements TextWatcher {

/**

* 改变之前text空格数量

*/

    int spaceNumberA =0;

    /**

* text改变之前的长度

*/

    private int beforeTextLength =0;

    private int onTextLength =0;

    private boolean isChanged =false;

    private StringBufferbuffer =new StringBuffer();

    private EditTexteditText;

    /**

* text最大长度限制

*/

    private int maxLenght;

    private SpaceTypespaceType;

    /**

* 记录光标的位置

*/

    private int location =0;

    /**

* 是否是主动设置text

*/

    private boolean isSetText =false;

    public SpaceTextWatcher(EditText editText, int maxLenght) {

this.editText = editText;

        this.maxLenght = maxLenght;

        if (editText ==null) {

new NullPointerException("editText is null");

        }

spaceType = SpaceType.defaultType;

//        if(maxLenght==48){

//            spaceType = SpaceType.bankCardNumberType;

//        }else if(maxLenght==13){

//            spaceType = SpaceType.mobilePhoneNumberType;

//        }else if(maxLenght == 21){

//            spaceType = SpaceType.IDCardNumberType;

//        }

        editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(

maxLenght)});

        editText.addTextChangedListener(this);

    }

@Override

    public void beforeTextChanged(CharSequence s, int start, int count,

                                  int after) {

beforeTextLength = s.length();

        if (buffer.length() >0) {

buffer.delete(0, buffer.length());

        }

spaceNumberA =0;

        for (int i =0; i < s.length(); i++) {

if (s.charAt(i) ==' ') {

spaceNumberA++;

            }

}

}

@Override

    public void onTextChanged(CharSequence s, int start, int before, int count) {

onTextLength = s.length();

        buffer.append(s.toString());

        if (onTextLength ==beforeTextLength ||onTextLength >maxLenght

                ||isChanged) {

isChanged =false;

return;

        }

isChanged =true;

    }

@Override

    public void afterTextChanged(Editable s) {

if (isChanged) {

location =editText.getSelectionEnd();

//            ToastUtils.showToastCenter("=="+editText.getSelectionEnd());

            int index =0;

            while (index

                if (buffer.charAt(index) ==' ') {

buffer.deleteCharAt(index);

                }else {

index++;

                }

}

index =0;

            int spaceNumberB =0;

            while (index

                spaceNumberB = insertSpace(index, spaceNumberB);

                index++;

            }

String str =buffer.toString();

            // 下面是计算光位置的

            if (spaceNumberB >spaceNumberA) {

//                ToastUtils.showToastCenter("插入空格了");

                location += (spaceNumberB -spaceNumberA);

                spaceNumberA = spaceNumberB;

            }

if (isSetText) {//ss

                location = str.length();

                isSetText =false;

            }else if (location > str.length()) {

location = str.length();

            }else if (location <0) {

location =0;

            }

updateContext(s, str);

            isChanged =false;

        }

}

/**

* 更新编辑框中的内容

*

    * @param editable

    * @param values

    */

    private void updateContext(Editable editable, String values) {

if (spaceType == SpaceType.IDCardNumberType||spaceType == SpaceType.mobilePhoneNumberType||spaceType == SpaceType.bankCardNumberType) {

editable.replace(0, editable.length(), values);

        }else {

editText.setText(values);

            try {

editText.setSelection(location);

            }catch (Exception e) {

e.printStackTrace();

            }

}

}

/**

* 根据类型插入空格

*

    * @param index

    * @param spaceNumberAfter

    * @return

    * @see [类、类#方法、类#成员]

*/

    private int insertSpace(int index, int spaceNumberAfter) {

switch (spaceType) {

case defaultType:// 相隔四位空格

                if (index >=4

                        && (index % (4 * (spaceNumberAfter +1)) == spaceNumberAfter)) {

buffer.insert(index, ' ');

                    spaceNumberAfter++;

                }

break;

            case bankCardNumberType:

if (index >=4

                        && (index % (4 * (spaceNumberAfter +1)) == spaceNumberAfter)) {

buffer.insert(index, ' ');

                    spaceNumberAfter++;

                }

break;

            case mobilePhoneNumberType:

if (index ==3

                        || ((index >7) && ((index -3) % (4 * spaceNumberAfter) == spaceNumberAfter))) {

buffer.insert(index, ' ');

                    spaceNumberAfter++;

                }

break;

            case IDCardNumberType:

if (index ==6

                        || ((index >10) && ((index -6) % (4 * spaceNumberAfter) == spaceNumberAfter))) {

buffer.insert(index, ' ');

                    spaceNumberAfter++;

                }

break;

            default:

if (index >3

                        && (index % (4 * (spaceNumberAfter +1)) == spaceNumberAfter)) {

buffer.insert(index, ' ');

                    spaceNumberAfter++;

                }

break;

        }

return spaceNumberAfter;

    }

/***

* 计算需要的空格数

*

    * @return 返回添加空格后的字符串长度

    * @see [类、类#方法、类#成员]

*/

    private int computeSpaceCount(CharSequence charSequence) {

buffer.delete(0, buffer.length());

        buffer.append(charSequence.toString());

        int index =0;

        int spaceNumberB =0;

        while (index

            spaceNumberB = insertSpace(index, spaceNumberB);

            index++;

        }

buffer.delete(0, buffer.length());

        return index;

    }

/**

* 设置空格类型

*

    * @param spaceType

    * @see [类、类#方法、类#成员]

*/

    public void setSpaceType(SpaceType spaceType) {

this.spaceType = spaceType;

        if (this.spaceType == SpaceType.IDCardNumberType) {

editText.setInputType(InputType.TYPE_CLASS_TEXT);

        }else if (this.spaceType == SpaceType.bankCardNumberType) {

editText.setInputType(InputType.TYPE_CLASS_TEXT);

        }else if (this.spaceType == SpaceType.mobilePhoneNumberType) {

editText.setInputType(InputType.TYPE_CLASS_PHONE);

        }

}

/**

* 设置输入字符

*

    * @param charSequence

    * @return 返回设置成功失败

    * @see [类、类#方法、类#成员]

*/

    public boolean setText(CharSequence charSequence) {

if (editText !=null && !TextUtils.isEmpty(charSequence) && computeSpaceCount(charSequence) <=maxLenght) {

isSetText =true;

            editText.removeTextChangedListener(this);

            editText.setText(charSequence);

            editText.addTextChangedListener(this);

return true;

        }

return false;

    }

/**

* 得到输入的字符串去空格后的字符串

*

    * @return

    * @see [类、类#方法、类#成员]

*/

    public StringgetTextNotSpace() {

if (editText !=null) {

return delSpace(editText.getText().toString());

        }

return null;

    }

/**

* 得到输入的字符串去空格后的长度

*

    * @return

    * @see [类、类#方法、类#成员]

*/

    public int getLenghtNotSpace() {

if (editText !=null) {

return getTextNotSpace().length();

        }

return 0;

    }

/**

* 得到空格数量

*

    * @return

    * @see [类、类#方法、类#成员]

*/

    public int getSpaceCount() {

return spaceNumberA;

    }

/**

* 去掉字符空格,换行符等

*

    * @param str

    * @return

    * @see [类、类#方法、类#成员]

*/

    private StringdelSpace(String str) {

if (str !=null) {

str = str.replaceAll("\r", "");

            str = str.replaceAll("\n", "");

            str = str.replace(" ", "");

        }

return str;

    }

/**

* 空格类型

*

    * @author 江钰锋 0152

    * @version [版本号, 2015年4月21日]

    * @see [相关类/方法]

    * @since [产品/模块版本]

*/

    public enum SpaceType {

/**

* 默认类型

*/

        defaultType,

        /**

* 银行卡类型

*/

        bankCardNumberType,

        /**

* 手机号类型

*/

        mobilePhoneNumberType,

        /**

* 身份证类型

*/

        IDCardNumberType;

    }

}

```

相关文章

网友评论

      本文标题:Android输入框格式化Edittexthelp(有项目可下载

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