Android软键盘工具类
public class SoftKeyboardUtils {
/**
* 隐藏或显示软键盘
* 如果现在是显示调用后则隐藏 反之则显示
*/
public static void showORhideSoftKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
// 显示软键盘
private fun showKeyboard(editText: EditText) {
//调用系统输入法
editText.postDelayed({
val inputManager: InputMethodManager =
context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.showSoftInput(editText, 0)
// SoftKeyboardUtils.showSoftKeyboard(this)
}, 60)
}
// 隐藏软键盘
private fun hideShowKeyboard(editText: EditText) {
val manager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
manager.hideSoftInputFromWindow(editText.windowToken, 0)
}
/**
* 判断软键盘是否显示方法
*/
public static boolean isSoftShowing(Activity activity) {
//获取当屏幕内容的高度
int screenHeight = activity.getWindow().getDecorView().getHeight();
//获取View可见区域的bottom
Rect rect = new Rect();
//DecorView即为activity的顶级view
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
//考虑到虚拟导航栏的情况(虚拟导航栏情况下:screenHeight = rect.bottom + 虚拟导航栏高度)
//选取screenHeight*2/3进行判断
boolean isOpen = screenHeight * 2 / 3 > rect.bottom + getSoftButtonsBarHeight(activity);
LegoLog.d("键盘是否显示:" + isOpen);
return isOpen;
}
/**
* 底部虚拟按键栏的高度
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private static int getSoftButtonsBarHeight(Activity activity) {
DisplayMetrics metrics = new DisplayMetrics();
//这个方法获取可能不是真实屏幕的高度
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int usableHeight = metrics.heightPixels;
//获取当前屏幕的真实高度
activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
int realHeight = metrics.heightPixels;
if (realHeight > usableHeight) {
return realHeight - usableHeight;
} else {
return 0;
}
}
}
注意,在Dialog dismiss之前调用该方法。(先关闭软键盘,再关闭弹窗)
补充:
上面键盘弹起无效时:
//调用系统输入法
binding.llSearch.postDelayed({
Log.d("caowj", "弹起输入法")
binding.etAddress.isFocusableInTouchMode = true
binding.etAddress.isFocusable = true
binding.etAddress.requestFocus()
val inputManager: InputMethodManager =
context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.showSoftInput(binding.etAddress, 0)
if (!inputManager.isActive(binding.etAddress)) {
inputManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
}
}, 200)