点击返回键,同时隐藏输入区域和软键盘

我当时要做的需求是,底部评论区,和评论编辑区域,首先评论区域是显示的,编辑区域是隐藏的,当点击评论区时,隐藏评论区,显示编辑评论的区域(见图)和edittext获取焦点,弹出软键盘,

在刚开始做的时候尝试了很多种方法(成功的方法在最后一条,中间是我做的一些实验的方法和一开始一些思路,着急看结果的可以直接看下面的最后一条),

1.第一个想到的就是重写onkeydown方法,当时遇到的问题就是当软键盘和编辑评论区同时出现的时候,第一次点击返回键,首先响应返回键的是软键盘,在第二次点击返回的时候才是编辑评论的区域,第三次点击响应的是返回上一个页面;我发现自己重写的onkeydown方法根本不起作用,又尝试的几次之后果断放弃了。下面是我做的一些尝试:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    InputMethodManager imm = (InputMethodManager)
            mEditComment.getContext().getSystemService(INPUT_METHOD_SERVICE);
    if (event.getKeyCode()==KeyEvent.KEYCODE_BACK){
        if (imm.isActive(mEditComment)){
            onFocusChange(false);
            return true;
        }else {
            return super.onKeyDown(keyCode, event);        
        }
    }
    return super.onKeyDown(keyCode, event);
}

2.然后我再网上找了一些资料,发现了dispatchKeyEvent()方法,这个方法是做一个keyevent的消息分发的,经过测试很高兴,在我的两个测试机上都没有问题(一个小米一个华为的),在这两个机器上面点击返回键都可以实现同时隐藏软键盘和评论编辑区域,但是问题是在同事的其他手机上例如OPPO和vivo、三星上面就不行,反应的问题和onkeydown方法一样,点击返回键软键盘先获取返回键的状态,然后才是编辑评论区域,所以这个方法也宣告不可行。下面是我做的尝试

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    InputMethodManager imm = (InputMethodManager)
            mEditComment.getContext().getSystemService(INPUT_METHOD_SERVICE);
    if (event.getKeyCode()==KeyEvent.KEYCODE_BACK){
        if (imm.isActive(mEditComment)){
            onFocusChange(false);
            return true;
        }else {
            return super.dispatchKeyEvent(event);
        }
    }
    return super.dispatchKeyEvent(event);
}
3.然后不行接着找,这时候找到了另一个方法,通过判断输入区域的h和oldh来判断软键盘是否响应了返回键,响应的时候就去做相应的操作,这个方法在网上也挺多的,但是我测试完了之后,发现一个问题,就是当隐藏的时候在出现到软键盘出现,这个h和oldh是在不断变化的,没有好的方法做出唯一的判断处理,其实看到这个方法的时候我一度以为自己要成功了,但是后来还是不行,可能我在这块有点绕,没看明白,但是还是做了一些尝试,这块没有测试阶段,然后思路卡这了。

4.就在快放弃的时候,看到了这个方法,http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%89%9B/16517.shtml,他提到可以再edittext里面用

dispatchkeyeventpreime方法,然后就找到了真正的答案,因为原博主不让转载的原因我在里贴出来网址吧,感兴趣的小伙伴可以看一下,

http://blog.csdn.net/siobhan/article/details/8268543。我最终通过重写了一个评论编辑区域LinearLayout,然后在linearlayout中重写了dispatchkeyeventpreime()方法,实现了需求,方法如下:

public class NoTouchLinearLayout extends LinearLayout {
    public NoTouchLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

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


    private OnResizeListener mListener;

    public interface OnResizeListener {
        void OnResize();
    }

    public void setOnResizeListener(OnResizeListener l) {
        mListener = l;
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return true;
    }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            mListener.OnResize();
            return true;
        }
        return super.dispatchKeyEventPreIme(event);
    }
}

然后在初始化完成控件之后调用监听,执行隐藏操作,OK!第一次写,写的不好的多多指正,欢迎交流!

mEditVGLyt = (NoTouchLinearLayout) findViewById(R.id.edit_vg_lyt);
mEditVGLyt.setOnResizeListener(new NoTouchLinearLayout.OnResizeListener() {
    @Override
    public void OnResize() {
        onFocusChange(false);
    }
});


你可能感兴趣的:(Android)