EditText关于输入小数点的小问题
2016-05-22 22:22
302 查看
最近项目马上要上线了,有时间会尽量去整理所做的东西,不然下次做的时候,又要百度了。
今天主要说的是EditText的输入问题,看上出很简单吗,只需要在xml文件中声明inputType=”number/text/numberDecimal”,但是啊,即使你输入了numberDecimal,大约似乎editText中还是不能输入小数点,为什么呢?对不起啊,毕竟我也是小白,我也不清楚,但是找到一个方法啊:
这个设置是可以的,但是这个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)是个什么意思:
而我们CHARACTERS是一个final static 型的数组:
主要到有个mAccepted 变量,不看源码只看名字就知道在键盘输入时可以接受的字符,那么我们这里需要接受小数点,那应该选CHARACTERS[2],来个逻辑算法即可啊。所以我想你应该明白了为啥sign和decimal需要填写false和true了吗?再者,如果我们不仅需要输入1-9.+-呢?
下面是我们的editText可以接受两个小数点的TextOnChangeListener:
今晚就写到这了,有时间继续了啊。。。。
今天主要说的是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; } }
今晚就写到这了,有时间继续了啊。。。。
相关文章推荐
- Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)
- MYSQL分区表测试
- 聊一聊服务器的那些事儿
- 计算机网络之HTTP代理服务器
- android 获取屏幕高度和宽度 的方法
- 反射和动态代理【原】
- C++作业6
- linux 下安装配置svn简易指南
- 单例模式
- 对字符串进行MD5加密
- Service给Activity传递参数更改UI
- 杭电5690
- 线性表基本概念及其基本操作实现
- xp对opengl的支持问题
- Android亮屏和熄屏控制
- 计算机程序的构造和解释 练习 1.36
- touch事件分析
- Python学习 (三 高级特性)
- HDU 5696 区间的价值 (DFS)
- 用二进制包方式安装mysql实验