您的位置:首页 > 其它

EditText关于输入小数点的小问题

2016-05-22 22:22 302 查看
最近项目马上要上线了,有时间会尽量去整理所做的东西,不然下次做的时候,又要百度了。

今天主要说的是EditText的输入问题,看上出很简单吗,只需要在xml文件中声明inputType=”number/text/numberDecimal”,但是啊,即使你输入了numberDecimal,大约似乎editText中还是不能输入小数点,为什么呢?对不起啊,毕竟我也是小白,我也不清楚,但是找到一个方法啊:

editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL) ;
editText.setKeyListener(new DigitsKeyListener(false, true)) ;


这个设置是可以的,但是这个DigitsKeyListener是个啥玩意儿呢?源码中解释为:As for all implementations of {@link KeyListener}, this class is only concerned with hardware keyboards. Software input methods have no obligation to trigger the methods in this class.英语不是很好,简单翻译一下: 是keyListener的一种实现,本类只与硬件输入发相关,相关的软件输入法是没有条件触发本类中的方法的。说的不是很明白,换句话说就是我们输入的时候,输入的DigitsKey(数字键)是归我们管的,其他的管不了(好吧原谅我四级永远都是424吧)。我们来看看这个DigitsKeyListener(false, true)是个什么意思:

public DigitsKeyListener(boolean sign, boolean decimal) {
mSign = sign;
mDecimal = decimal;

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


而我们CHARACTERS是一个final static 型的数组:

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', '-', '+', '.' },
};


主要到有个mAccepted 变量,不看源码只看名字就知道在键盘输入时可以接受的字符,那么我们这里需要接受小数点,那应该选CHARACTERS[2],来个逻辑算法即可啊。所以我想你应该明白了为啥sign和decimal需要填写false和true了吗?再者,如果我们不仅需要输入1-9.+-呢?

下面是我们的editText可以接受两个小数点的TextOnChangeListener:

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public abstract class CustomTextWatcher implements TextWatcher {
private boolean isChanged = false;
EditText edt;

public CustomTextWatcher(EditText edt) {
super();
this.edt = edt;
}

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

@Override
public void afterTextChanged(Editable s) {
if (isChanged) {// ----->如果字符未改变则返回
return;
}
String str = s.toString();

isChanged = true;
String cuttedStr = str;
boolean flag = false;
/* 删除字符串中的dot */
for (int i = str.length() - 1; i >= 0; i--) {
char c = str.charAt(i);
if ('.' == c && i <= str.length() - 3) {
cuttedStr = str.substring(0, i + 3);
if (cuttedStr.endsWith(".")) {
cuttedStr = cuttedStr.substring(0, i + 1);
}
flag = true;
break;
}
}
if (flag) {
edt.setText(cuttedStr);
}

edt.setSelection(edt.length());
isChanged = false;
}
}


今晚就写到这了,有时间继续了啊。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: