package com.mfh.comna.view.widget; import android.content.Context; import android.text.Editable; import android.text.InputFilter; import android.text.InputType; import android.text.Selection; import android.text.Spanned; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.Toast; import java.util.Timer; import java.util.TimerTask; /** * EditText强化版,可自由定制各种属性 * Created by yxm on 2014/9/26. */ public class SuperEditText extends EditText { private int len; private int intTempMax; private Float floatTempMax; private String tempStr;//允许输入的字符 /** * 构造方法 * * @param context */ public SuperEditText(Context context) { super(context); } public SuperEditText(Context context, AttributeSet attrs) { super(context, attrs); } public SuperEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * 设置允许输入的字符 * * @param str */ public void setAcceptedChars(String str) { tempStr = str; setFilters(new InputFilter[]{ new InputFilter() { /** * @param charSequence 输入的文字 * @param i 开始位置 * @param i2 结束位置 * @param spanned 当前显示的内容 * @param i3 当前开始位置 * @param i4 当前结束位置 * @return */ @Override public CharSequence filter(CharSequence charSequence, int i, int i2, Spanned spanned, int i3, int i4) { if (!contains(tempStr, charSequence.toString())) { return ""; } return null; } } }); } /** * 设置最大值 * * @param max */ public void setMax(int max) { setInputType(InputType.TYPE_CLASS_NUMBER); setAcceptedChars("1234567890"); len = String.valueOf(max).length() - 1; intTempMax = max; addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void afterTextChanged(Editable editable) { if (editable.length() > len) { if (Integer.valueOf(editable.toString()) > intTempMax) { setText(String.valueOf(intTempMax)); Toast.makeText(getContext(), "金额不能大于" + String.valueOf(intTempMax), Toast.LENGTH_SHORT).show(); } //设置新光标所在的位置 Selection.setSelection(getText(), getText().length()); } } }); } /** * @param max * @param fraction 允许的小数位数 */ public void setMax(Float max, final int fraction) { setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); setAcceptedChars("1234567890."); len = String.valueOf(max.intValue()).length() - 1; floatTempMax = max; addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void afterTextChanged(Editable editable) { if (charCount(editable.toString(), '.') > 1) { setText(""); Toast.makeText(getContext(), "非法输入", Toast.LENGTH_SHORT).show(); } if (editable.length() > len) { if (charCount(editable.toString(), '.') == 1) { if ((editable.length() - 1 - editable.toString().lastIndexOf(".")) > fraction) { setText(editable.toString().substring(0, editable.toString().lastIndexOf(".") + 3)); Toast.makeText(getContext(), "小数部分不可大于" + String.valueOf(fraction) +"位", Toast.LENGTH_SHORT).show(); } } if (charCount(editable.toString(), '.') <= 1) { if (Float.valueOf(editable.toString()) > floatTempMax) { setText(String.valueOf(floatTempMax)); Toast.makeText(getContext(), "金额不能大于" + String.valueOf(floatTempMax), Toast.LENGTH_SHORT).show(); } } //设置新光标所在的位置 Selection.setSelection(getText(), getText().length()); } } }); } /** * 是否自动弹出键盘 * * @param b */ public void showSoftInput(Boolean b) { if (b == true) { setFocusable(true); setFocusableInTouchMode(true); requestFocus(); Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { show(); } }, 200); } } public void show() { InputMethodManager inputManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(this, 0); } /** * 找个一个字符串中某个字符出现的次数 * * @param s * @param c * @return */ public int charCount(String s, char c) { int len = s.length(); int count = 0; for (int i = 0; i < len; i++) { if (s.charAt(i) == c) { count++; } } return count; } /** * 判定输入的字符是否为允许输入的字符 * * @param str1 允许输入的字符 * @param str2 输入的字符 * @return */ public Boolean contains(String str1, String str2) { for (int i = 0; i < str2.length(); i++) { if (!str1.contains(str2.subSequence(i, i + 1))) { return false; } } return true; } }