需求:要求可以最多输入4位整数,并且小数部分最多输入2位,也就是xxxx.xx类型的字符串,中间包含很多组合比如xxx.x或者xx.xx等等,所以为了方便下一次使用决定自定义一个Edittext。
思路:监听输入框的字符输入,符合要求则显示,不符合要求则显示上一次的字符
废话不多说直接上代码:
1,自定义的EditText:
public class FloatEditTextView extends EditText implements TextWatcher { private String lastNumber; private Context context; private int integer_part; //整数部分 private int decimal_part; //小数部分 public FloatEditTextView(Context context) { this(context,null); } public FloatEditTextView(Context context, AttributeSet attrs) { this(context, attrs,android.R.attr.editTextStyle); } public FloatEditTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context =context; init(attrs); } private void init(AttributeSet attrs) { TypedArray typedArray = context.getTheme().obtainStyledAttributes( attrs, R.styleable.FloatEditTextView, 0, 0); setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL); integer_part =typedArray.getInteger(R.styleable.FloatEditTextView_integer_part,1); decimal_part =typedArray.getInteger(R.styleable.FloatEditTextView_decimal_part,1); if(integer_part>0&&decimal_part>0) { addTextChangedListener(this); } } @Override public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { lastNumber = s.toString(); } @Override public void afterTextChanged(Editable s) { String temp = s.toString(); int posDot = temp.indexOf("."); if (Pattern.matches("^[0-9]{1,"+integer_part+"}(\\.[0-9]{1,"+decimal_part+"})?$",temp)) { if(temp.startsWith("0")&&!temp.equals("0")){ if(posDot>1||posDot<0){ setText(temp.substring(1)); setSelection(getText().length()); } } }else { if (temp.endsWith(".")) { if (temp.length() == 1) { setText("0.0"); return; } if (temp.length() < lastNumber.length()) { String str = temp.substring(0, temp.length() - 1); setText(str); setSelection(getText().length()); return; } else { return; } } else if (temp.startsWith(".")) { setText(temp.substring(1, getText().length())); return; } else { if (!TextUtils.isEmpty(temp)&&temp!=lastNumber) { setText(lastNumber); setSelection(getText().length()); } } } } /** * 输入框编辑状态 */ public void setEditable(boolean flag) { setFocusable(flag); setFocusableInTouchMode(flag); } }2.资源文件中定义自己需要的属性,这里也就是使用过程中需要传递的参数,
integer_part
代表整数部分的位数,
decimal_part
代表小数部分的位数
<declare-styleable name="FloatEditTextView"> <attr name="integer_part" format="integer"></attr> <attr name="decimal_part" format="integer"></attr> </declare-styleable>3.使用该自定义的view
<com.view.FloatEditTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/common_black" android:textSize="16sp" android:background="@null" myView:integer_part="4" myView:decimal_part="2" />这里两个参数分别传了4和2也就是最多整数4位,小数2位,分享至此就结束了,这个过程中,最关键的还是正则表达式的书写,做出准确的判断,如果各位还有更好的办法,欢迎分享。