自定義組件-銀行卡號輸入框

package com.eternal.cardno;

import android.content.Context;
import android.text.Editable;
import android.text.Selection;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.widget.EditText;

/**
 * 銀行卡號輸入框
 * 
 * @author Administrator
 * 
 */
public class BankCardNumEditText extends EditText {

	public BankCardNumEditText(Context context) {
		super(context);

		this.addTextChangedListener(new BankCardNumWatcher());
	}

	public BankCardNumEditText(Context context, AttributeSet attrs) {
		super(context, attrs);

		this.addTextChangedListener(new BankCardNumWatcher());
	}

	/**
	 * 獲取真實的text(去掉空格)
	 * 
	 * @return
	 */
	public String getTextWithoutSpace() {
		String text = super.getText().toString();
		if (android.text.TextUtils.isEmpty(text)) {
			return "";
		} else {
			return text.replace(" ", "");
		}
	}

	/**
	 * 銀行卡號輸入框格式(每4位有個空格)
	 * 
	 * @author Administrator
	 * 
	 */
	class BankCardNumWatcher implements TextWatcher {
		int beforeTextLength = 0;
		int onTextLength = 0;
		boolean isChanged = false;

		int location = 0;// 記錄光標的位置
		private char[] tempChar;
		private StringBuffer buffer = new StringBuffer();
		int konggeNumberB = 0;

		@Override
		public void onTextChanged(CharSequence s, int start, int before,
				int count) {
			onTextLength = s.length();
			buffer.append(s.toString());
			if (onTextLength == beforeTextLength || onTextLength <= 3
					|| isChanged) {
				isChanged = false;
				return;
			}
			isChanged = true;
		}

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {
			beforeTextLength = s.length();
			if (buffer.length() > 0) {
				buffer.delete(0, buffer.length());
			}
			konggeNumberB = 0;
			for (int i = 0; i < s.length(); i++) {
				if (s.charAt(i) == ' ') {
					konggeNumberB++;
				}
			}
		}

		@Override
		public void afterTextChanged(Editable s) {
			if (isChanged) {
				location = getSelectionEnd();
				int index = 0;
				while (index < buffer.length()) {
					if (buffer.charAt(index) == ' ') {
						buffer.deleteCharAt(index);
					} else {
						index++;
					}
				}

				index = 0;
				int konggeNumberC = 0;
				while (index < buffer.length()) {
					if ((index == 4 || index == 9 || index == 14 || index == 19)) {
						buffer.insert(index, ' ');
						konggeNumberC++;
					}
					index++;
				}

				if (konggeNumberC > konggeNumberB) {
					location += (konggeNumberC - konggeNumberB);
				}

				tempChar = new char[buffer.length()];
				buffer.getChars(0, buffer.length(), tempChar, 0);
				String str = buffer.toString();
				if (location > str.length()) {
					location = str.length();
				} else if (location < 0) {
					location = 0;
				}
				setText(str);
				Editable etable = getText();
				Selection.setSelection(etable, location);
				isChanged = false;
			}
		}
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章