Android中调用手机自带输入法比如三星s5830i,仅限制输入浮点数,崩溃的原因
16lz
2021-01-23
今儿突然发现在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() {@Overridepublic 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());}}}}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic 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();//1GSLog.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);}}
更多相关文章
- Android 输入法框架流程整理
- android调用webservice方法,参数和返回值都用字符串
- android 发送短信 判断号码规则 判断字符数70
- 加载时不直接弹出输入法
- android 修改输入法中拼写检测默认值
- Android和Java判断字符串是否是中文
- android中如何屏蔽长按menu出现的输入法
- Android开发_在Android Studio中搜索项目中出现过的字符串