最近在做项目时,需要做自定义的软键盘。基本实现思路是在AndroidManifest中设置当前Activity属性:android:windowSoftInputMode="stateHidden|stateAlwaysHidden",EditText设置OnTouchListener监听,然后在监听中设置EditText的InputType属性,以及初始化自定义键盘并显示。
我的测试机是4.2系统的平板,当时测试的时候发现当点击EditText时系统键盘任然会弹出,而且自定义键盘也会弹出。然后又通过强制隐藏输入法键盘方法强制隐藏系统键盘
本以为设置该方法之后会奏效,但是事实并不理想,任然没有解决问题。后来发现此处是个坑,而且是个大大的坑,网上对于这种坑也是解释甚少。后来发现通过修改监听中的初始化方法可以有效地解决该问题的出现
```
etPwd.setOnTouchListener(newView.OnTouchListener() {
@Override
public booleanonTouch(View v,MotionEvent event) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
intcurrentVersion = android.os.Build.VERSION.SDK_INT;
String methodName =null;
if(currentVersion >=16){
// 4.2
methodName ="setShowSoftInputOnFocus";
}
else if(currentVersion >=14){
// 4.0
methodName ="setSoftInputShownOnFocus";
}
if(methodName ==null){
etPwd.setInputType(InputType.TYPE_NULL);
}
else{
Class cls = EditText.class;
Method setShowSoftInputOnFocus;
try{
setShowSoftInputOnFocus = cls.getMethod(methodName, boolean.class);
setShowSoftInputOnFocus.setAccessible(true);
setShowSoftInputOnFocus.invoke(etPwd, false);
}catch(NoSuchMethodException e) {
etPwd.setInputType(InputType.TYPE_NULL);
e.printStackTrace();
}catch(IllegalAccessException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}catch(IllegalArgumentException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}catch(InvocationTargetException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
// etPwd.setInputType(InputType.TYPE_NULL);
newKeyboardUtil(instance,instance,1,etPwd).showKeyboard();
return false;
}
});
```
网友评论