工具类,拿走就能用:
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;/*** Created by ChenboCui on /6/1.*/public class SoftKeyboardUtils {/*** 隐藏或显示软键盘* 如果现在是显示调用后则隐藏 反之则显示* @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*/public static void showSoftKeyboard(Activity activity){InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);imm.showSoftInput(activity.getWindow().getDecorView(),InputMethodManager.SHOW_FORCED);}/*** 强制隐藏软键盘* @param activity*/public static void hideSoftKeyboard(Activity activity){InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); //强制隐藏键盘}/*** 调用系统方法 强制隐藏软键盘* @param activity*/public static void hideSystemSoftKeyboard(Activity activity){((InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);}/*** 判断软键盘是否显示方法* @param activity* @return*/public static boolean isSoftShowing(Activity activity) {//获取当屏幕内容的高度int screenHeight = activity.getWindow().getDecorView().getHeight();//获取View可见区域的bottomRect rect = new Rect();//DecorView即为activity的顶级viewactivity.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;}}}}
我一般都是这样使用:
//点击返回按钮时判断软键盘状态,若软键盘开启则关闭、若软键盘关闭就直接退出if (SoftKeyboardUtils.isSoftShowing(RenActivity.this)){SoftKeyboardUtils.showORhideSoftKeyboard(RenActivity.this);}else {onBackPressed();}
如果你调用强制显示\隐藏软键盘没反应,试试这样:
et.postDelayed(new Runnable() {@Overridepublic void run() {InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);imm.showSoftInput(et.getEditText(),InputMethodManager.SHOW_FORCED);}},500);
et就是布局中的需要使用软键盘的控件,像edittext;关闭软键盘也是一样;