首页 > 解决方案 > Android - 屏幕键盘

问题描述

我知道,它被问了很多次,但是对于旧的 Android 版本,并不是所有的解决方案都有效。

我需要在 Android 10 系统上以编程方式控制屏幕键盘:

代码可以在 kotlin/java 中。

标签: androidkeyboard

解决方案


将这两个属性添加到您的父布局(例如:线性布局、相对布局)

android:focusable="false"
android:focusableInTouchMode="false" 

在您的活动中:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

或者,

  1. 您还可以在清单文件的活动中声明

    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Main"
      android:label="@string/app_name"
      android:windowSoftInputMode="stateHidden"
      >
    
  2. 如果您已经将 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);
}

推荐阅读