您的位置:首页 > 移动开发 > Android开发

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

2017-08-05 13:50 771 查看
最近在做的一个项目,需求加入即时通信,也就是聊天功能模块。

遇到了不少的坑,不过都一一解决了,分享下成果图:



在此分享一下关于解决聊天界面的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;
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android EditView 焦点
相关文章推荐