今儿突然发现在EditText里面设置属性 android:inputType="numberDecimal" 在某些三星手机(s5830i)导致其原生输入法奔溃的问题. 若是设置属性为android:inputType="number"则不会崩溃. 原来这些输入法调用不支持浮点数的,仅能支持整数的.
什么破输入法啊! 个别其他手机自带输入法也有这个问题,例如华为的。
因为不能使用系统自带过滤非浮点数的功能,若是自己写的话,需要考虑很多问题。
记下来如下代码方便以后使用。
TextEdit设置监听
过滤 空串,非浮点数,开头为0(例如 0123.11)的情况
String regEx = "^[0-9]+\\.{0,1}[0-9]{0,2}$";// 正则表达式 输入只能为浮点数,后面为2位小数字
priceEt.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s != null) { GSLog.e(HomeActivity.class, "onTextChanged:当前的CharSequence" + s.toString() + " start: " + start + " before: " + before + " count:" + count); if (".".equals(priceEt.getText().toString().trim()) || !(Pattern.matches(regEx, priceEt.getText() .toString().trim())) || 0 == Double.parseDouble(priceEt.getText() .toString().trim())) { String str = priceEt.getText().toString().trim(); if (priceEt.getText().toString().length() >= 1) { priceEt.setText(str.substring(0, priceEt.getText() .toString().length() - 1)); priceEt.setSelection(priceEt.getText().toString() .length()); } } } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } });xml文件:
<EditText android:id="@+id/gaswear_et_money" style="@style/font_gaswear_black_2" android:layout_width="@dimen/gaswear_tv_width" android:layout_marginLeft="@dimen/gaswear_tv_marginLeft" android:gravity="center" android:background="@null" android:singleLine="true" android:digits="0123456789." android:imeOptions="actionNext" android:maxLength="7" />
若是动态去写的EditText,没有xml文件,所以导致没办法在代码里限制仅仅允许输入的字符。没办法使用android:digits 这样的属性去过滤
下面是代码中动态添加EditText,进行字符过滤的解决办法。
et_GasPrice.setFilters(new InputFilter[] { new InputFilter() { public CharSequence filter(CharSequence src, int start, int end, Spanned dst, int dstart, int dend) { if(src!=null && src.length() >= 5 ){ return ""; } if(src!=null ){ str = src.toString().trim(); if(!".".equals(str) && !Utils.isNumberic(str) && !(Pattern.matches(regEx, str))){ str = "" ; } } return str; } } });
项目开发到2.0了,产品经理都换了5个了,新产品经理还在纠结这个问题。最后一致通过,之前的设计很**
现在解决方案是: 获取异常的手机,遇到该手机就特殊处理。
下面这个方法是遇到GT-s5830i 就切换成字符型输入法
private void changeInputType() { //获取当前手机型号 String model = CommonUtils.getModel(); //1 GSLog.e(GasWearActivityF.class, "当前手机型号: "+model); if(model!=null&&model.equalsIgnoreCase("GT-S5830i")){ moneyEt.setInputType(EditorInfo.TYPE_CLASS_TEXT); priceEt.setInputType(EditorInfo.TYPE_CLASS_TEXT); mileageEt.setInputType(EditorInfo.TYPE_CLASS_TEXT); } }