android 定制手机号码,Android自定义EditText实现手机号码和银行卡号自动分隔

项目中可能会有许多需要输入手机号码及文案的输入框,如果需要输入卡号的话,一堆卡号堆在一起,第一不太美观,第二也容易出错,用户体验不太好,鄙人无聊之时,写了这么一个小小控件,可以自动来进行卡号和电话号码的分割,自测还算OK,废话不多说,直接上代码~~

1.attrs.xml定义属性信息

2.自定义EditText,继承EditText

package com.rong360.android.view;

import android.content.Context;

import android.content.res.TypedArray;

import android.text.Editable;

import android.text.InputType;

import android.text.TextUtils;

import android.text.TextWatcher;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.EditText;

import java.util.ArrayList;

/**

* Created by me.

*/

public class RongDivisionEditText extends EditText {

private static final String TAG = "RongDivisionEditText";

private static final int PHONE_TYPE = 1;

private static final int BANK_TYPE = 2;

private static final int DEFAULT_BANK_CARD_LENGTH = 16;

private static final int DEFAULT_PHONE_NUMBER_LENGTH = 11;

private static final int DEFAULT_DIVIDE_LENGTH = 4;

private static final String DEFAULT_DIVIDE_SYMBOL = "-";

private String mSperator;

// 存放需分隔处文本窗独

private ArrayList groupCoords = new ArrayList();

// 记录上次增减文本的长度,判断本次添加还是删除

private int mLastLength = 0;

// xml文件设置的输入长度

private int mTotalLength;

// 记录加上分隔符后总长度

private int mLength;

// 当前输入类型

private int mType;

public RongDivisionEditText(Context context) {

super(context);

}

public RongDivisionEditText(Context context, AttributeSet attrs) {

super(context, attrs);

setInputType(InputType.TYPE_CLASS_NUMBER);

TypedArray typedArray = context.obtainStyledAttributes(attrs,

R.styleable.RongDivisionEditText);

if (typedArray != null) {

mTotalLength = typedArray.getInteger(

R.styleable.RongDivisionEditText_rongTotalLength, DEFAULT_BANK_CARD_LENGTH);

mSperator = typedArray.getString(R.styleable.RongDivisionEditText_sperator);

if (TextUtils.isEmpty(mSperator)) {

mSperator = DEFAULT_DIVIDE_SYMBOL;

}

mType = typedArray.getInt(R.styleable.RongDivisionEditText_type, BANK_TYPE);

if (mType == BANK_TYPE) {

// 计算需要几个分隔符及每个对应的长度

int mode = mTotalLength % DEFAULT_BANK_CARD_LENGTH;

int divider = mTotalLength / DEFAULT_DIVIDE_LENGTH;

int groupCoordsLength = mode == 0 ? divider - 1 : divider;

this.mLength = mTotalLength + groupCoordsLength;

for (int i = 1; i < groupCoordsLength + 1; i++) {

groupCoords.add(i * (DEFAULT_DIVIDE_LENGTH + 1) - 1);

}

typedArray.recycle();

} else {

initPhoneGroupCoords();

this.mLength = DEFAULT_PHONE_NUMBER_LENGTH + groupCoords.size();

}

setMaxWidth(mLength);

}

addTextChangedListener(new DivisionTextWatcher());

}

private void initPhoneGroupCoords() {

//这里偷懒了,不计算了,手机号默认这么分了。。。。懒。。。

groupCoords.add(3);

groupCoords.add(8);

}

public RongDivisionEditText(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

/**

* 获取文本框输入的内容,自动替换掉分隔符

*

* @return

*/

public String getContent() {

return getText().toString().trim().replace(mSperator, "");

}

private class DivisionTextWatcher implements TextWatcher {

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override

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

Log.i(TAG, "s = " + s.toString() + " , s.length = " + s.length() + " , mLength = " + mLength);

if (s.length() <= mLength) {

if (mLastLength == 0) {

mLastLength = s.length();

}

if (groupCoords.contains(s.length() - 1)) {

if (s.length() < mLastLength) {

// delete

s = s.toString().substring(0, s.length() - 1);

setText(s.toString());

} else if (s.length() > mLastLength) {

// add

s = s.toString().substring(0, s.length() - 1) + mSperator + s.toString().substring(s.length() - 1);

setText(s.toString());

}

}

} else {

s = s.toString().substring(0, s.length() - 1);

setText(s.toString());

}

setSelection(s.length());

mLastLength = s.length();

}

@Override

public void afterTextChanged(Editable s) {

}

}

}

3.在xml布局中使用

android:id="@+id/myDivision"

android:layout_width="match_parent"

android:layout_height="45dip"

android:focusable="true"

android:gravity="center_vertical"

android:hint="输入银行卡卡号"

app:rongTotalLength="19"

app:sperator=" "

app:type="phone" />    ok,这样便实现自动分割了,可能还不太够灵活,后期有时间再修改吧,大神轻喷~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值