一宙橱、背景
????????輸入銀行卡號(hào)碼或身份證號(hào)碼時(shí),會(huì)遇到要求添加空格進(jìn)行格式化的需求蘸拔,即每隔N個(gè)數(shù)字添加一個(gè)空格师郑。下面對(duì)自己的一個(gè)實(shí)現(xiàn),做一個(gè)筆記调窍。
二宝冕、分析
????????對(duì)輸入控件EditText進(jìn)行監(jiān)聽,毫無疑問選擇TextWatcher邓萨,在afterTextChanged方法對(duì)結(jié)果進(jìn)行處理地梨。
????????首先菊卷,獲取當(dāng)前光標(biāo)位置前面的非空字符數(shù)。
????????然后宝剖,添加空格格式化洁闰。通過StringBuilder對(duì)字符數(shù)進(jìn)行每隔N個(gè)非空字符添加一個(gè)空格,若最后一個(gè)字符是空格則刪除万细;
????????再次扑眉,調(diào)整選擇光標(biāo)位置。光標(biāo)位置之前的非空字符數(shù)要與第一步獲取的一致雅镊,若光標(biāo)位置在空格后襟雷,則調(diào)整到空格前(防止刪除功能異常),并進(jìn)行越界判斷矯正仁烹;
????????最后耸弄,賦值并更改光標(biāo)位置。若格式化之后的字符串與處理之前不一致卓缰,則重新賦值计呈。
三、實(shí)現(xiàn)
????????具體代碼如下:
/**
* 自動(dòng)添加空白征唬,格式化輸入
*/
public class SpaceFormatTextWatcher implements TextWatcher {
private EditText mEditText;
private int mIntervalNum;
/**
* 構(gòu)造方法
*
* @param editText 添加該檢測(cè)的輸入控件
* @param intervalNum 空白間隔數(shù)(每間隔多少個(gè)數(shù)添加一個(gè)空白)
*/
public SpaceFormatTextWatcher(EditText editText, int intervalNum) {
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
this.mEditText = editText;
this.mIntervalNum = intervalNum;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (mIntervalNum <= 0) {
return;
}
String text = s.toString();
//光標(biāo)
int selectionStart = mEditText.getSelectionStart();
//光標(biāo)前非空格字符數(shù)
String substring = text.substring(0, selectionStart);
int charNum = substring.replaceAll(" ", "").length();
//空格數(shù)量
int spaceNum = 0;
StringBuilder sb = new StringBuilder();
//添加空格
for (int i = 0, length = text.length(); i < length; i++) {
char c = text.charAt(i);
//非空格
if (c != ' ') {
sb.append(c);
if ((sb.length() - spaceNum) % mIntervalNum == 0) {
sb.append(' ');
spaceNum++;
}
}
}
//最后一個(gè)是空格捌显,則刪除
int lastSpaceIndex = sb.lastIndexOf(" ");
if (lastSpaceIndex >= 0 && lastSpaceIndex == sb.length() - 1) {
sb.deleteCharAt(lastSpaceIndex);
}
String spaceFormatText = sb.toString();
//調(diào)整光標(biāo)位置至非空字符數(shù)為charNum
selectionStart = (charNum / mIntervalNum) * (mIntervalNum + 1) + charNum % mIntervalNum;
//若光標(biāo)位置在空格后面,調(diào)整至空格前面
if (selectionStart % (mIntervalNum + 1) == 0) {
selectionStart--;
}
//邊界控制
int length = spaceFormatText.length();
if (selectionStart < 0) {
selectionStart = 0;
}
if (selectionStart > length) {
selectionStart = length;
}
if (!spaceFormatText.equals(text)) {
mEditText.setText(spaceFormatText);
}
mEditText.setSelection(selectionStart);
}
}
使用:
editText.addTextChangedListener(new SpaceFormatTextWatcher(editText, intervalNum));