package com.yidianling.common.tools; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import com.yidianling.common.tools.keyboard.GlobalLayoutListener; /** * Created by vondear on 2016/1/24. */ public class RxKeyboardTool { /** * 避免输入法面板遮挡 * <p>在manifest.xml中activity中设置</p> * <p>android:windowSoftInputMode="stateVisible|adjustResize"</p> */ /** * 动态隐藏软键盘 * * @param activity activity */ public static void hideSoftInput(Activity activity) { View view = activity.getWindow().peekDecorView(); if (view != null) { InputMethodManager inputmanger = (InputMethodManager) activity .getSystemService(Context.INPUT_METHOD_SERVICE); inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0); } } /** * 点击隐藏软键盘 * * @param activity * @param view */ public static void hideKeyboard(Activity activity, View view) { InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } /** * 显示软件盘 * @param activity * @param isShow */ public static void showKeyboard(Activity activity,boolean isShow) { InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); if (isShow) { if (activity.getCurrentFocus() == null) { imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); } else { imm.showSoftInput(activity.getCurrentFocus(), 0); } } else { if (activity.getCurrentFocus() != null) { imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } } /** * 动态隐藏软键盘 * * @param context 上下文 * @param edit 输入框 */ public static void hideSoftInput(Context context, EditText edit) { edit.clearFocus(); InputMethodManager inputmanger = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); inputmanger.hideSoftInputFromWindow(edit.getWindowToken(), 0); } /** * 点击屏幕空白区域隐藏软键盘(方法1) * <p>在onTouch中处理,未获焦点则隐藏</p> * <p>参照以下注释代码</p> */ public static void clickBlankArea2HideSoftInput0() { Log.i("tips", "U should copy the following code."); /* @Override public boolean onTouchEvent (MotionEvent event){ if (null != this.getCurrentFocus()) { InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); } return super.onTouchEvent(event); } */ } /** * 点击屏幕空白区域隐藏软键盘(方法2) * <p>根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘</p> * <p>需重写dispatchTouchEvent</p> * <p>参照以下注释代码</p> */ public static void clickBlankArea2HideSoftInput1() { Log.i("tips", "U should copy the following code."); /* @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideKeyboard(v, ev)) { hideKeyboard(v.getWindowToken()); } } return super.dispatchTouchEvent(ev); } // 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘 private boolean isShouldHideKeyboard(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] l = {0, 0}; v.getLocationInWindow(l); int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth(); return !(event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom); } return false; } // 获取InputMethodManager,隐藏软键盘 private void hideKeyboard(IBinder token) { if (token != null) { InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); } } */ } /** * 动态显示软键盘 * * @param context 上下文 * @param edit 输入框 */ public static void showSoftInput(Context context, EditText edit) { edit.setFocusable(true); edit.setFocusableInTouchMode(true); edit.requestFocus(); InputMethodManager inputManager = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(edit, 0); } /** * 切换键盘显示与否状态 * * @param context 上下文 * @param edit 输入框 */ public static void toggleSoftInput(Context context, EditText edit) { edit.setFocusable(true); edit.setFocusableInTouchMode(true); edit.requestFocus(); InputMethodManager inputManager = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); } public static void setKeyboardChangedListener(Activity activity,OnKeyboardChangedListener listener) { View decorView = activity.getWindow().getDecorView(); decorView.getViewTreeObserver().addOnGlobalLayoutListener(new GlobalLayoutListener(decorView,listener)); } public interface OnKeyboardChangedListener { /** * 键盘事件 * * @param isShow 键盘是否展示 * @param keyboardHeight 键盘高度(当isShow为false时,keyboardHeight=0) * @param screenWidth 屏幕宽度 * @param screenHeight 屏幕可用高度(不包含底部虚拟键盘NavigationBar), 即屏幕高度-键盘高度(keyboardHeight) */ void onChange(boolean isShow, int keyboardHeight, int screenWidth, int screenHeight); } }