EditText与软键盘使用记录

版权声明:不为无益之事,何以遣有涯之生。 https://blog.csdn.net/lj402159806/article/details/80238880

点击EditText之外的区域,隐藏软键盘

在父布局与其他控件中加入如下标签

android:clickable="true"
android:focusableInTouchMode="true"
android:focusable="true"

设置OnFocusChange监听,focus改变后隐藏软键盘

mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                //隐藏软键盘
                if (!hasFocus) {
                    InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    im.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                }
            }
        });

使用EditText时,监听软键盘隐藏

方法1

重写EditText控件

/**
 * 拦截键盘向下的 EditTextView
 */
public class ListenKeyboardEditText extends AppCompatEditText {

    public ListenKeyboardEditText(Context context) {
        super(context);
    }

    public ListenKeyboardEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ListenKeyboardEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == 1) {
            super.onKeyPreIme(keyCode, event);
            //隐藏键盘时清除焦点
            clearFocus();
            if (onKeyBoardHideListener != null) {
                onKeyBoardHideListener.onKeyHide(keyCode, event);
            }
            return false;
        }
        return super.onKeyPreIme(keyCode, event);
    }

    /**
     * 键盘监听接口
     */
    OnKeyBoardHideListener onKeyBoardHideListener;

    public void setOnKeyBoardHideListener(OnKeyBoardHideListener onKeyBoardHideListener) {
        this.onKeyBoardHideListener = onKeyBoardHideListener;
    }

    public interface OnKeyBoardHideListener {
        void onKeyHide(int keyCode, KeyEvent event);
    }
}

设置键盘隐藏监听,键盘隐藏时回调

    mEditText.setOnKeyBoardHideListener(new ListenKeyboardEditText.OnKeyBoardHideListener() {
            @Override
            public void onKeyHide(int keyCode, KeyEvent event) {
                //do something
            }
        });

方法2

监听view视图树

public class KeyboardChangeListener implements ViewTreeObserver.OnGlobalLayoutListener {

    private static final String TAG = "ListenerHandler";
    /**
     * 当前界面的根视图
     */
    private View mContentView;
    /**
     * 此时根视图的高度
     */
    private int mOriginHeight;
    /**
     * 改变之前根视图的高度
     */
    private int mPreHeight;
    private KeyBoardListener mKeyBoardListen;

    public KeyboardChangeListener(Activity activity) {
        if (activity == null) {
            Log.i(TAG, "contextObj is null");
            return;
        }
        mContentView = findContentView(activity);
        if (mContentView != null) {
            addContentTreeObserver();
        }
    }

    private View findContentView(Activity activity) {
        return activity.findViewById(android.R.id.content);
    }

    private void addContentTreeObserver() {
        mContentView.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }

    @Override
    public void onGlobalLayout() {
        // 先获取到当前根视图的高度
        int currHeight = mContentView.getHeight();
        if (currHeight == 0) {
            return;
        }

        boolean hasChange = false;
        if (mPreHeight == 0) {
            mPreHeight = currHeight;
            mOriginHeight = currHeight;
        } else {
            if (mPreHeight != currHeight) {
                hasChange = true;
                mPreHeight = currHeight;
            } else {
                hasChange = false;
            }
        }
        if (hasChange) {
            boolean isShow;
            int keyboardHeight = 0;
            // 当当前的根视图高度和初始化时的高度一样时,说明此时软键盘没有显示,是消失状态
            if (mOriginHeight == currHeight) {
                //hidden
                isShow = false;
            } else {
                // 此时,根视图的高度减少了,而减少的部分就是软键盘的高度,软键盘显示状态
                //show
                keyboardHeight = mOriginHeight - currHeight;
                isShow = true;
            }

            if (mKeyBoardListen != null) {
                mKeyBoardListen.onKeyboardChange(isShow, keyboardHeight);
            }
        }
    }

    public void setKeyBoardListener(KeyBoardListener keyBoardListen) {
        this.mKeyBoardListen = keyBoardListen;
    }

    // 资源释放
    public void destroy() {
        if (mContentView != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                mContentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        }
    }

    public interface KeyBoardListener {

        void onKeyboardChange(boolean isShow, int keyboardHeight);
    }
}
private KeyboardChangeListener mKeyboardChangeListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_curve_config);
        mKeyboardChangeListener = new KeyboardChangeListener(this);
        mKeyboardChangeListener.setKeyBoardListener(new KeyboardChangeListener.KeyBoardListener() {
            @Override
            public void onKeyboardChange(boolean isShow, int keyboardHeight) {

            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mKeyboardChangeListener.destroy();
    }

多个EditText添加addTextChangedListener时共用一个TextWatcher

@Override
public void afterTextChanged(Editable editable) {
    if (editable == mEditText1.getEditableText()) {
        // DO STH
    } else if (editable == mEditText2.getEditableText()) {
        // DO STH
    }
}

该方法原理是对比editable的地址引用因此只能用在afterTextChanged方法中

参考自:
https://stackoverflow.com/questions/5702771/how-to-use-single-textwatcher-for-multiple-edittexts/24282010#24282010

猜你喜欢

转载自blog.csdn.net/lj402159806/article/details/80238880