EditText etSearch = findViewById(R.id.etSearch); SoftKeyBoardListener.setListener(mActivity, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() { @Override public void keyBoardShow(int height) { Toast.makeText(mContext, "显示"+height, Toast.LENGTH_SHORT).show(); //软键盘显示的监测 } @Override public void keyBoardHide(int height) { Toast.makeText(mContext, "隐藏"+height, Toast.LENGTH_SHORT).show(); //软键盘隐藏的监测 } }); etSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { int action = keyEvent.getAction(); int keyCode = keyEvent.getKeyCode(); if ((action == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_SEARCH || keyCode == KeyEvent.KEYCODE_ENTER)) { //监测软键盘 按钮按下 hideSoftInput(); return true; } return false; } }); etSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { //输入框文本变化前调用 } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { //输入框文本变化时调用 } @Override public void afterTextChanged(Editable editable) { //输入框文本变化后调用 这个用来监测变化后的操作 } });
/** SoftKeyBoardListener.java **/
package com.shangame.fiction.core.utils; import android.app.Activity; import android.content.Context; import android.graphics.Rect; import android.view.View; import android.view.ViewTreeObserver; import android.view.inputmethod.InputMethodManager; /** * @describe: 监听软件盘 * @author: berlin * @time: 2020/05/23 * @other: */ public class SoftKeyBoardListener { private View rootView;//activity的根视图 int rootViewVisibleHeight;//纪录根视图的显示高度 private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener; public SoftKeyBoardListener(Activity activity) { //获取activity的根视图 rootView = activity.getWindow().getDecorView(); //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变 rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //获取当前根视图在屏幕上显示的大小 Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); int visibleHeight = r.height(); System.out.println(""+visibleHeight); if (rootViewVisibleHeight == 0) { rootViewVisibleHeight = visibleHeight; return; } //根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变 if (rootViewVisibleHeight == visibleHeight) { return; } //根视图显示高度变小超过200,可以看作软键盘显示了 if (rootViewVisibleHeight - visibleHeight > 200) { if (onSoftKeyBoardChangeListener != null) { onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight); } rootViewVisibleHeight = visibleHeight; return; } //根视图显示高度变大超过200,可以看作软键盘隐藏了 if (visibleHeight - rootViewVisibleHeight > 200) { if (onSoftKeyBoardChangeListener != null) { onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight); } rootViewVisibleHeight = visibleHeight; return; } } }); } private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) { this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener; } public interface OnSoftKeyBoardChangeListener { void keyBoardShow(int height); void keyBoardHide(int height); } public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) { SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity); softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener); } /** * Show the soft input. * * @param activity The activity. */ public static void showSoftInput(final Activity activity) { InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); if (imm == null) return; View view = activity.getCurrentFocus(); if (view == null) { view = new View(activity); view.setFocusable(true); view.setFocusableInTouchMode(true); view.requestFocus(); } imm.showSoftInput(view, InputMethodManager.SHOW_FORCED); } /** * Show the soft input. * * @param view The view. */ public static void showSoftInput(final View view) { InputMethodManager imm = (InputMethodManager) Utils.getApp().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm == null) return; view.setFocusable(true); view.setFocusableInTouchMode(true); view.requestFocus(); imm.showSoftInput(view, InputMethodManager.SHOW_FORCED); } /** * Hide the soft input. * * @param activity The activity. */ public static void hideSoftInput(final Activity activity) { InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); if (imm == null) return; View view = activity.getCurrentFocus(); if (view == null) view = new View(activity); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } /** * Hide the soft input. * * @param view The view. */ public static void hideSoftInput(final View view) { InputMethodManager imm = (InputMethodManager) Utils.getApp().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm == null) return; imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } }