Android 软键盘不会上推重新选择的视图
Android soft keyboard not pushing up views that are reselected
所以,我有一个 EditText
并且我有一个功能,当您在 EditText
外部单击时,它会隐藏键盘。接下来会发生什么:
- 第一次选择
EditText
时,键盘出现并将整个 View
向上推。
- 我取消选择
EditText
(单击 EditText
旁边的任意位置),键盘变为隐藏状态
- 当我再次点击
EditText
时,键盘出现了,但是 View
没有被拉起,我看不到我的 EditText
如何在选中 EditText
时再次向上推该视图?
这是隐藏软键盘的代码:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
View v = getCurrentFocus();
if (v != null &&
(ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) &&
v instanceof EditText &&
!v.getClass().getName().startsWith("android.webkit.")) {
int scrcoords[] = new int[2];
v.getLocationOnScreen(scrcoords);
float x = ev.getRawX() + v.getLeft() - scrcoords[0];
float y = ev.getRawY() + v.getTop() - scrcoords[1];
if (x < v.getLeft() || x > v.getRight() || y < v.getTop() || y > v.getBottom())
hideKeyboard(this);
}
return super.dispatchTouchEvent(ev);
}
和hideKeyboard()
方法
public static void hideKeyboard(Activity activity) {
if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
}
}
使用这个方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.
INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
return true;
}
找到解决方案...
我不得不使用虚拟布局(在我的例子中 LinearLayout
):
public static void hideKeyboard(Activity activity) {
if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
}
activity.findViewById(R.id.dummy).requestFocus();
}
现在,当我重新选择我的 EditText 时,它开始工作了。
所以,我有一个 EditText
并且我有一个功能,当您在 EditText
外部单击时,它会隐藏键盘。接下来会发生什么:
- 第一次选择
EditText
时,键盘出现并将整个View
向上推。 - 我取消选择
EditText
(单击EditText
旁边的任意位置),键盘变为隐藏状态 - 当我再次点击
EditText
时,键盘出现了,但是View
没有被拉起,我看不到我的EditText
如何在选中 EditText
时再次向上推该视图?
这是隐藏软键盘的代码:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
View v = getCurrentFocus();
if (v != null &&
(ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) &&
v instanceof EditText &&
!v.getClass().getName().startsWith("android.webkit.")) {
int scrcoords[] = new int[2];
v.getLocationOnScreen(scrcoords);
float x = ev.getRawX() + v.getLeft() - scrcoords[0];
float y = ev.getRawY() + v.getTop() - scrcoords[1];
if (x < v.getLeft() || x > v.getRight() || y < v.getTop() || y > v.getBottom())
hideKeyboard(this);
}
return super.dispatchTouchEvent(ev);
}
和hideKeyboard()
方法
public static void hideKeyboard(Activity activity) {
if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
}
}
使用这个方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.
INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
return true;
}
找到解决方案...
我不得不使用虚拟布局(在我的例子中 LinearLayout
):
public static void hideKeyboard(Activity activity) {
if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
}
activity.findViewById(R.id.dummy).requestFocus();
}
现在,当我重新选择我的 EditText 时,它开始工作了。