您的位置:首页 > 移动开发 > Android开发

EditText只能输入2位小数及一个小数点

2017-04-01 10:39 127 查看
项目新需求:EditText输入的数值只能输入2位小数…

直接看结果的:

//只允许输入一个小数点和0--9的数字
mEditText.setKeyListener(new DigitsKeyListener(false, true));


想看详细的,往下看:

1.只允许输入2位小数

editText在xml里面添加了
android:digits=".0123456789"


这需求挺简单的,妥妥的

mEditText.addTextChangedListener(new TextWatcher() {

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

@Override
public void afterTextChanged(Editable s) {
String editStr = s.toString().trim();

int posDot = editStr.indexOf(".");
//不允许输入3位小数,超过三位就删掉
if (posDot < 0) {
return;
}
if (editStr.length() - posDot - 1 > 2) {
s.delete(posDot + 3, posDot + 4);
} else {
//TODO...在这里写逻辑
}
}
});


一运行,恩挺简单的,完美…

然后手贱试了下,我擦,居然符号和.可以输入多个…

难道是digits失效了?那换一个方法吧…

又在EditText的xml属性里面添加了
android:inputType="numberDecimal"


to young…还是不行…

于是使用正则…不行

再使用InputFilter,发现有点用…但是还是能够输入多个”.”以及”-“

http://blog.csdn.net/a1533588867/article/details/53035475这是使用InputFilter链接…

我明明在speChat里面添加了”-“还是不行,而且还得额外监听…

2.换个方法,使用setInputType()方法

private void setInputType(EditText edit) {
edit.setKeyListener(new DigitsKeyListener() {
@Override
public int getInputType() {
return InputType.TYPE_NUMBER_FLAG_DECIMAL;
}

@Override
protected char[] getAcceptedChars() {
String digists = "1234567890.";
char[] data = digists.toCharArray();
return data;
}
});
}


实际使用发现xml里面设置digits并没有什么卵用,删掉…使用代码设置

clean,rebuild,run…

怎么弹出的是英文键盘….

怎么还能输入多个”.”….

我xml里面设置的难道和这边重写的重了?删掉这边重写的…

private void setInputType(EditText edit) {
edit.setKeyListener(new DigitsKeyListener() {
@Override
protected char[] getAcceptedChars() {
String digists = "1234567890.";
char[] data = digists.toCharArray();
return data;
}
});
}


再次运行…

弹出的是数字键盘,完美…

还是能输入多个”.”……….

要不写个逻辑判断一下”.”如果有多的”.”就给截掉算了…

还是再找找,应该有更完美的方法.

3.查看DigitsKeyListener源码

看看
edit.setKeyListener(new DigitsKeyListener() {...}
里面的DigitsKeyListener吧.

private char[] mAccepted;
private static final int SIGN = 1;
private static final int DECIMAL = 2;

private static final char[][] CHARACTERS = {
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' },
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+' },
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' },
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+', '.' },
};

/**
* Allocates a DigitsKeyListener that accepts the digits 0 through 9,
* plus the minus sign (only at the beginning) and/or decimal point
* (only one per field) if specified.
*/
public DigitsKeyListener(boolean sign, boolean decimal) {
mSign = sign;
mDecimal = decimal;

int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);
mAccepted = CHARACTERS[kind];
}


这方法返回的是一个数组,我要的结果无疑是CHARACTERS[2].

看看SIGN=1,DECIMAL=2.

根据 | 的运算规则…

只有 kind = (00)B | (10)B = (10)B = 2;

也就是sign = false,decimal = true;

尝试设置一下

mEditText.setKeyListener(new DigitsKeyListener(false, true));


弹出的是数字键盘,不能输入其他符号,只能输入一个小数点…

最终:

//只允许输入一个小数点和0--9的数字
mEditText.setKeyListener(new DigitsKeyListener(false, true));
mEditText.addTextChangedListener(new Text
b7e6
Watcher() {

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

@Override
public void afterTextChanged(Editable s) {
String editStr = s.toString().trim();

int posDot = editStr.indexOf(".");
//不允许输入3位小数,超过三位就删掉
if (posDot < 0) {
return;
}
if (editStr.length() - posDot - 1 > 2) {
s.delete(posDot + 3, posDot + 4);
} else {
//TODO...这里写逻辑
}
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐