目标是在显示系统输入法的时候想要隐藏系统下方的系统菜单
在安卓模拟器上运行的情况如下:下面是活动中的重写的显示系统输入法的方法@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
assert v != null;
imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
v.setClickable(true);
v.setFocusable(true);
v.setFocusableInTouchMode(true);
v.requestFocusFromTouch(); Log.e(TAG, "dispatchTouchEvent: 111111111111111111" );
}
}
Log.e(TAG, "dispatchTouchEvent: 22222222222222222222222" );
return super.dispatchTouchEvent(ev);
}
Log.e(TAG, "dispatchTouchEvent: 333333333333333333333" );
// 必不可少,否则所有的组件都不会有TouchEvent了
return getWindow().superDispatchTouchEvent(ev) || onTouchEvent(ev);
} public boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] leftTop = {0, 0};
//获取输入框当前的location位置
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
return !(event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom);
}
return false;
}
在安卓模拟器上运行的情况如下:下面是活动中的重写的显示系统输入法的方法@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
assert v != null;
imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
v.setClickable(true);
v.setFocusable(true);
v.setFocusableInTouchMode(true);
v.requestFocusFromTouch(); Log.e(TAG, "dispatchTouchEvent: 111111111111111111" );
}
}
Log.e(TAG, "dispatchTouchEvent: 22222222222222222222222" );
return super.dispatchTouchEvent(ev);
}
Log.e(TAG, "dispatchTouchEvent: 333333333333333333333" );
// 必不可少,否则所有的组件都不会有TouchEvent了
return getWindow().superDispatchTouchEvent(ev) || onTouchEvent(ev);
} public boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] leftTop = {0, 0};
//获取输入框当前的location位置
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
return !(event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom);
}
return false;
}
解决方案 »
- ~~~~~~关于Socket通讯的奇怪问题!!!折腾了好几天,求帮助~~~~~~
- 帮忙看下这错误如何解决
- 有高手熟悉FragmentActivity,ActivityThread,ActivityManager方面的吗?给些资料或者思路。。555
- 毕设要做一个电子书软件
- 学习LIstView与Adapter时的问题
- 反编译一个游戏
- 安卓调用webservice,返回的是一个dataset,里面一张表,我该怎么解析?
- ERROR: APK path is not specified for module "Dict"
- 为什么我的avd有这种问题,都搜不到
- Android中删除照片操作
- Android Studio App 開發
- 一个类似美团的app里能否有多种不同功能?
* 禁掉系统软键盘
*/
public void hideSoftInputMethod() {
mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
int currentVersion = 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) {
mEdit.setInputType(InputType.TYPE_NULL);
} else {
Class<EditText> cls = EditText.class;
Method setShowSoftInputOnFocus;
try {
setShowSoftInputOnFocus = cls.getMethod(methodName, boolean.class);
setShowSoftInputOnFocus.setAccessible(true);
setShowSoftInputOnFocus.invoke(mEdit, false);
} catch (NoSuchMethodException e) {
mEdit.setInputType(InputType.TYPE_NULL);
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
自己参考