弹起来的时候
- 第一个参数View,最好是 EditText 或者它的子类。
- 布局必须加载完成。(通过延时加载的方式来解决,View.postDelayed() 是一个解决方案)
隐藏的时候
- 需要依赖于一个view
- 还是通过延迟处理来完成,会有效果
如果还是没效果,那就把时间弄大点,比如300ms
软键盘隐藏部分组件的处理 TODO
https://www.jianshu.com/p/89eec61fa699
/**
* 软键盘显示
*
* @param view
*/
@RequiresApi(api = Build.VERSION_CODES.CUPCAKE)
public static void showSoftKeyboard(final View view) {
if (view == null) {
return;
}
view.setFocusable(true);
view.setFocusableInTouchMode(true);
if (!view.isFocused()) {
view.requestFocus();
}
view.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager inputMethodManager = (InputMethodManager) view.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(view, 0);
}
}, 100);
}
/**
* 软键盘隐藏
*
* @param view
*/
public static void hideSoftKeyboard(final View view) {
if (view == null) {
return;
}
view.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager manager = (InputMethodManager) view.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}, 100);
}
/**
* 选取屏幕高度的2/3来判断 软键盘是否弹出
* @param context
* @return
*/
public static boolean isSoftShowing(Context context) {
// 获取当前屏幕内容的高度
int screenHeight = ((Activity)context).getWindow().getDecorView().getHeight();
// 获取View可见区域的bottom
Rect rect = new Rect();
// DecorView即为activity的*view
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
((Activity)context).getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
}
// 考虑到虚拟导航栏的情况(虚拟导航栏情况下:screenHeight = rect.bottom + 虚拟导航栏高度)
// 选取screenHeight*2/3进行判断
return screenHeight*2/3 > rect.bottom;
}