本文章源码下载地址: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。
以下为效果图:
本文介绍如何在Android应用中使用InputFilter来限制用户输入特定格式的数字和小数,以避免因输入不合法字符而导致的程序崩溃。
244

被折叠的 条评论
为什么被折叠?



