Android对EditText做输入限制

本文介绍如何在Android应用中使用InputFilter来限制用户输入特定格式的数字和小数,以避免因输入不合法字符而导致的程序崩溃。

本文章源码下载地址: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。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值