Android对EditText做输入限制

来源:互联网 发布:mynba2k18网络维护中 编辑:程序博客网 时间:2024/06/05 19:09

本文章源码下载地址:EditLimitTest

Android很多情况下需要让用户只输入数字或者小数,因此都会在xml中设置其输入属性:

android:inputType="numberDecimal"

但是光这样可不行,如果用户只输入“.”,那么由于这个“.”是字符串而不是数字,因此会引起程序崩溃。

解决的方法一般有两种:
1、获取用户的输入,对用户的输入进行判断,不符合则提示用户重新输入。该方式用户体验较差。
2、可以对输入框的输入进行限制,不让用户输入不该输入的字符。该方式用户体验较好。

这里使用InputFilter实现限制用户输入。代码如下所示:

package com.jinuo.mhwang.editinputlimittest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.InputFilter;import android.text.Spanned;import android.util.Log;import android.widget.EditText;import java.util.regex.Matcher;import java.util.regex.Pattern;public class MainActivity extends AppCompatActivity {    /**    *  "."号相对于字符串长度偏移量    */    public static final int POINT_OFFSET = 3;    /**    *  取得点的最少长度    */    public static final int GET_POINT_LOWEST_LENGTH = 4;    /**    *  可以输入的最大数    */    public static final double MAX_INPUT = 100.0;    /**    *  输入限制的正则表达式    */    public static final String REGEX_INPUT_LIMIT = "[0-9.]";    EditText et_beLimited;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et_beLimited = (EditText) findViewById(R.id.et_beLimited);        et_beLimited.setFilters(new InputFilter[]{getLimitFilter()});    }    private InputFilter getLimitFilter(){        InputFilter filter = new InputFilter() {            @Override            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {                Log.d("------>", "source is "+source.toString()+  // 本次输入字符                        "\nstart is "+start+    // start和end一般为0和1,即sorce长度                        "\nend is "+end+                        "\ndest is "+dest+      // 上一次输入内容                        "\ndstart is "+dstart+  // 光标开始位置                        "\ndend is "+dend);    // 光标结束位置                // 限制1:只能输入数字和"."                Pattern p = Pattern.compile(REGEX_INPUT_LIMIT);                Matcher matcher = p.matcher(source.toString());                if (!matcher.find()){                    return "";                }                // 限制2:首位不能输入"."                if (dend == 0 && source.toString().equals(".")){                    return "";                  // 这里如果返回null无效                }                // 限制3:如果已经有“.”,则不能再输入“.”                if (dest.toString().contains(".") && source.equals(".")){                    return "";                }                // 限制4:如果上一个字符为0,则下一位只能输入点                if (dest.toString().equals("0") && !source.toString().equals(".")){                    return "";                }                // 限制5:如果大于100.0,则不能输入                double inputNum = Double.parseDouble(dest.toString()+source);                if (inputNum > MAX_INPUT){                    return "";                }                // 限制6:如果上次上两位数前是".",则不能再输入(0.01长度为4)                if (dest.length() >= GET_POINT_LOWEST_LENGTH                        && dest.charAt(dest.length()-POINT_OFFSET) == '.'){                    return "";                }                return null;            }        };        return filter;    }}

需要注意的是,使用InputFilter后,原先设置的android:inputType="numberDecimal"
将不再生效,所以需要添加限制1。

以下为效果图:
这里写图片描述

原创粉丝点击