类似于QQ聊天界面的EditView输入控件点击获取焦点弹出软件盘,点击屏幕使EditView失去焦点隐藏软件盘。

来源:互联网 发布:js判断弹出提示框 编辑:程序博客网 时间:2024/06/04 19:23


最近在做的一个项目,需求加入即时通信,也就是聊天功能模块。
遇到了不少的坑,不过都一一解决了,分享下成果图:




在此分享一下关于解决聊天界面的EditView输入控件点击获取焦点弹出软件盘,点击屏幕使EditView失去焦点隐藏软件盘的方法。


使EditView强制失去焦点:


/**     * 取消输入控件的焦点     * @return 成功返回true,失败返回false     */    public boolean escInputViewFocus(){        reset();        {            //强制控件失去焦点            mEtInput.clearFocus();            mEtInput.setFocusable(false);        }        return true;    }


使EditView强制获取焦点:


/**     * 为输入控件强制获取焦点     */    public void setEditTextInputFocus() {        {    //强制获取焦点            mEtInput.setFocusable(true);            mEtInput.setFocusableInTouchMode(true);            mEtInput.requestFocus();}        TDevice.showSoftKeyboard(this.mEtInput);    }


为EditView控件添加点击事件:

/**     * 为输入控件添加点击事件     */    private void setEditViewOnClick(){        mEtInput.setOnClickListener(v->setEditTextInputFocus() );    }


重写跟布局控件拦截触摸屏事件方法,需要自定义一个View继承该父布局,然后重写方法。

我这里的根布局是RelativeLayout控件,直接贴代码:


/** * 拦截触摸手势处理 * Created by wujiuye on 2017/8/5. */public class InterceptRelativeLayout extends RelativeLayout {    /**     * 触屏事件监听接口     */    public interface OnInterceptTouchListener{        /**         * @return true表示要拦截该事件处理,false表示处理但不拦截         */        boolean onTouch();    }    private OnInterceptTouchListener mOnTouchListener=null;    public void setOnInterceptTouchListener(OnInterceptTouchListener onTouchListener){        this.mOnTouchListener = onTouchListener;    }    public InterceptRelativeLayout(Context context) {        this(context,null);    }    public InterceptRelativeLayout(Context context, AttributeSet attrs) {        this(context, attrs,0);    }    public InterceptRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {        this(context, attrs, defStyleAttr,0);    }    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)    public InterceptRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);    }    /**     * 判断与拦截触屏事件     * @param ev     * @return     */    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        if(mOnTouchListener!=null)            if(mOnTouchListener.onTouch())                return true;        return super.onInterceptTouchEvent(ev);    }}



在Activity中使用:

//点击屏幕让输入控件失去焦点        mInterceptRelativeLayout.setOnInterceptTouchListener(() -> {            if (mEmojiFragment.inputViewHasFocus())//如果输入控件当前有焦点                return mEmojiFragment.escInputViewFocus();//强制EditView失去焦点            return false;        });



阅读全文
0 0
原创粉丝点击