android - Android - 屏幕键盘
问题描述
我知道,它被问了很多次,但是对于旧的 Android 版本,并不是所有的解决方案都有效。
我需要在 Android 10 系统上以编程方式控制屏幕键盘:
- 在需要时显示屏幕键盘,而不是在需要 Android 系统时(!)。
- 在需要时隐藏屏幕键盘,而不是在需要 Android 系统时隐藏(!)。
- 检查是否显示屏幕键盘。
- 防止系统显示/隐藏屏幕键盘——只有我会用它来操作(!)。
代码可以在 kotlin/java 中。
解决方案
将这两个属性添加到您的父布局(例如:线性布局、相对布局)
android:focusable="false"
android:focusableInTouchMode="false"
在您的活动中:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
或者,
您还可以在清单文件的活动中声明
<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name" android:windowSoftInputMode="stateHidden" >
如果您已经将 android:windowSoftInputMode 用于诸如 adjustResize 或 adjustPan 之类的值,则可以组合两个值:
<activity ... android:windowSoftInputMode="stateHidden|adjustPan" ... >
以编程方式显示键盘:
public static boolean showKeyboard(View view) {
if (view == null) {
return false;
}
try {
InputMethodManager inputManager = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
view.requestFocus();
return inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
} catch (Exception ignored) {
}
return false;
}
隐藏键盘:
public static void hideKeyboard(View view) {
if (view == null) {
return;
}
try {
InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (!imm.isActive()) {
return;
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
view.clearFocus();
} catch (Exception e) {
}
}
在键盘上显示监听器:
public static void OnkeyBoardShowListener(final Activity activity) {
final View activityRootView = activity.findViewById(android.R.id.content);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
activityRootView.getWindowVisibleDisplayFrame(rect);
int heightRoot = activityRootView.getRootView().getHeight();
int heightDiff = heightRoot - rect.bottom;
if (heightDiff > dpToPx(activity, 200)) {
//Keyboard is open
}else if (heightDiff < dpToPx(activity, 200)) {
//Keyboard is close
}
}
});
}
将 Dp 转换为 Px :
private static float dpToPx(Context context, int dp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp, metrics);
}
推荐阅读
- matlab - 以下优化问题的解决方案是什么?
- excel - 使用宏删除 Excel VBA 模块中的过程
- python - 如何使用 asyncio 在不断增长的队列中异步请求 URL?
- php - PHP 有效日期格式
- javascript - 地图返回承诺中的数组为空 - NODE JS
- ruby-on-rails - Ruby on Rails 外键问题
- python - 我的问题可以用 Python 解决吗?是这样,怎么样?
- fail2ban - fail2ban apache-badbots 已经禁止了,这不奇怪吗?
- php - php mysql 根据结果显示表徽章
- node.js - 在 Windows 上的 nextJs App 中使用绝对导入