1. 程式人生 > >android 軟鍵盤管理

android 軟鍵盤管理

package com.dejun.commonsdk.util;

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.inputmethod.InputMethodManager;

/**
 * Author:DoctorWei
 * Time:2018/12/27 9:13
 * Description:軟鍵盤的管理包括 開啟和關閉
 * email:
[email protected]
*/ public class KeyBoradUtil { /** * 此方法需要指定焦點 (所以EditText需要繪製完成並獲取焦點) * @param activity * @param isShow */ public static void showKeyBoard(Activity activity, boolean isShow){ InputMethodManager inputMethodManager= (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); if (inputMethodManager==null){ return; } if (isShow){ if (activity.getCurrentFocus()!=null){//有焦點開啟 inputMethodManager.showSoftInput(activity.getCurrentFocus(),0); }else{//無焦點開啟 inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); } }else{ if (activity.getCurrentFocus()!=null){//有焦點關閉 inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS); }else{ //無焦點關閉 inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); } } } /** * 隱藏或顯示軟鍵盤 無需和焦點相關 * 如果現在是顯示呼叫後則隱藏 反之則顯示 * @param activity */ public static void showOrHideSoftKeyboard(Activity activity) { InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } /** * 判斷軟鍵盤是否顯示方法 * @param activity * @return */ 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);//軟鍵盤左頂點餓的高度在螢幕的2/3以內 } /** * 底部虛擬按鍵欄的高度 * getRealMetrics()和getMetrics()獲取到的螢幕資訊差別只在於widthPixels或heightPixels的值是否去除虛擬鍵所佔用的畫素,和是否全屏和沉浸模式無關。 * @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; } } }