Android中调用手机自带输入法比如三星s5830i,仅限制输入浮点数,崩溃的原因

今儿突然发现在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);
		}
	}


你可能感兴趣的:(android,EditText,浮点,限制输入字符类型)