package com.basic.security.utils; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.graphics.Rect; import android.os.Build; import android.util.DisplayMetrics; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import com.basic.security.base.BaseApplication; public class KeyboardUtil { public static void setupUI(View view) { // Set up touch listener for non-text box views to hide keyboard. if (!(view instanceof EditText)) { view.setOnTouchListener((v, event) -> { KeyboardUtil.hideSoftKeyboard(); return false; }); } //If a layout container, iterate over children and seed recursion. if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); setupUI(innerView); } } } public static void hideSoftKeyboard() { Activity activity = BaseApplication.getApplication().activity; InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService( Activity.INPUT_METHOD_SERVICE); View view = activity.getCurrentFocus(); if (view != null) { inputMethodManager.hideSoftInputFromWindow( view.getWindowToken(), 0); } } public static void showKeyboard() { InputMethodManager imm = (InputMethodManager) BaseApplication.getApplication().activity.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 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进行判断 return screenHeight * 2 / 3 > rect.bottom + getSoftButtonsBarHeight(activity); } /** * 底部虚拟按键栏的高度 * * @return */ @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; } } }