Android开发之常用的自定义输入框之EditText
生活随笔
收集整理的這篇文章主要介紹了
Android开发之常用的自定义输入框之EditText
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們先來看下效果圖:
?
直接上源碼,這是公司項目里面的
import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Editable; import android.text.Selection; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.EditText;/*** 帶刪除按鈕的EditText 適配銀行卡輸入** @author huanghe*/ public class ClearEditText extends EditText {/*** 清楚按鈕的圖標*/private Drawable drawableClear;/*** 設置銀行卡四位一空格*/int beforeTextLength = 0;int onTextLength = 0;boolean isChanged = false;int location = 0;private char[] tempChar;private StringBuffer buffer = new StringBuffer();int konggeNumberB = 0;private OnTextLengthListener mOnTextLengthListener;private boolean isBankNoType;private int maxLength;/*** 最大長度** @param maxLength*/public void setMaxLength(int maxLength) {this.maxLength = maxLength;invalidate();}/*** 銀行卡類型** @param bankNoType*/public void setBankNoType(boolean bankNoType) {isBankNoType = bankNoType;invalidate();}public interface OnTextLengthListener {/*** 按鈕可點擊*/void onButtonEnable();/*** 按鈕不可點擊*/void onButtonUnEnable();}public void setOnTextLengthListener(OnTextLengthListener onTextLengthListener) {this.mOnTextLengthListener = onTextLengthListener;}public ClearEditText(Context context) {super(context);init(context, null);}public ClearEditText(Context context, AttributeSet attrs) {super(context, attrs);init(context, attrs);}public ClearEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context, attrs);}private void init(Context context, AttributeSet attrs) {// 獲取自定義屬性drawableClear = getResources().getDrawable(R.drawable.yhsh_ic_et_delete);updateIconClear();// 設置TextWatcher用于更新清除按鈕顯示狀態addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {if (isBankNoType) {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++;}}}}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {if (isBankNoType) {onTextLength = s.length();buffer.append(s.toString());if (onTextLength == beforeTextLength || onTextLength <= 3 || isChanged) {isChanged = false;return;}isChanged = true;}}@Overridepublic void afterTextChanged(Editable s) {updateIconClear();if (isChanged && isBankNoType) {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;}sendLengthState(s, maxLength);}});setOnFocusChangeListener(new OnFocusChangeListener() {@Overridepublic void onFocusChange(View v, boolean hasFocus) {updateIconClear();}});}/*** 發送editText的長度符合要求的狀態** @param s* @param maxLength*/private void sendLengthState(Editable s, int maxLength) {int etLength = s.length();String etText = s.toString();if (maxLength == 23) {//銀行卡if (etLength <= 23 && etLength >= 18) {etText.replaceAll(" ", "");dispatchEnable();} else {dispatchUnEnable();}} else if (maxLength == 18 && ValidateUtils.checkIdNumber(etText)) {//身份證if (maxLength == etLength) {dispatchEnable();} else {dispatchUnEnable();}} else if (maxLength != 0) {//純數字if (maxLength == etLength) {dispatchEnable();} else {dispatchUnEnable();}} else {//姓名類if (etLength != 0) {dispatchEnable();} else {dispatchUnEnable();}}}private void dispatchEnable() {if (mOnTextLengthListener != null) {mOnTextLengthListener.onButtonEnable();}}private void dispatchUnEnable() {if (mOnTextLengthListener != null) {mOnTextLengthListener.onButtonUnEnable();}}@Overridepublic boolean onTouchEvent(MotionEvent event) {int xDown = (int) event.getX();if (event.getAction() == MotionEvent.ACTION_DOWN && xDown >= (getWidth() - getCompoundPaddingRight() * 2) && xDown < getWidth()) {// 清除按鈕的點擊范圍 按鈕自身大小 +-paddingsetText("");return false;}super.onTouchEvent(event);return true;}/*** 更新清除按鈕圖標顯示*/private void updateIconClear() {// 獲取設置好的drawableLeft、drawableTop、drawableRight、drawableBottomDrawable[] drawables = getCompoundDrawables();if (length() > 0 && isFocused()) {showIcon(true, drawables);} else {showIcon(false, drawables);}}private void showIcon(boolean isShow, Drawable[] drawables) {if (isShow) {setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], drawableClear,drawables[3]);} else {setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], null,drawables[3]);}}/*** 清空文本的方法*/public void clearText() {setText("");} }這是源碼里面用到的工具類
import java.util.regex.Pattern;/**** 校驗類*/public class ValidateUtils {private static final String PATTERN_IDCARD = "([0-9]{17}([0-9]|X|x))|([0-9]{15})";/*** 判斷身份證位數或格式的正確性** @param idNumber* @return*/public static boolean checkIdNumber(String idNumber) {return Pattern.matches(PATTERN_IDCARD, idNumber);}}?
總結
以上是生活随笔為你收集整理的Android开发之常用的自定义输入框之EditText的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端微服务搭建(Single-Spa +
- 下一篇: Android开发之通过ImageVie