特立独行的在输入法弹起的时候将指定控件往上推

来源:互联网 发布:索尼rx100一代知乎 编辑:程序博客网 时间:2024/05/01 02:49

最近,测试妹子在测试登录的时候发现下面的按钮被输入法挡住了,提出这个体验不好,看不到下面的按钮不行,所以让我们在输入法弹出的时候,将用户名和密码的输入框往上挪一挪。

    这个是成品。

   

    说干就干,首先,想到的是能不能主动的监听输入法的弹出跟隐藏,然而,系统并没有提供专门的回调接口处理这些事情,然后,在往上也找了一些,但是并没有任何一个能够解决我的问题,因为我的这个比较特殊,当输入法弹起来的时候并没有挡住输入框,所以网上提出的很多解决办法都是无效了,折腾了一会,我决定自己弄。

    首先,我决定用属性动画来实现布局的上下的滑动,所以必须让我知道啥时候来进行动画的执行,这个很明确,当收入法出来的时候,我们需要将布局弹上去,当输入法被收下去的时候,我们需要将布局弹回来。所以最好的处理方法是当输入法弹出来的时候有个回调告诉我输入法出来了,然而并没有这个方法,唉,淡淡的忧伤。然后,我想到了输入法的本质其实就是一个对话框,所以他弹出来的时候势必会引起布局的变化,所以我对最外层的容器控件进行了事件的监听,如下:

addOnLayoutChangeListener(

    new View.OnLayoutChangeListener() {
       @Override
       public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {

       }

});        

    不过这样只能判断容器控件的Layout发生了变化,而不能判断是输入法的显示还是隐藏,所以现在最大的问题就是怎么判断到底是该将布局将上推还是向下拉。我们知道,当EditText被点击的时候,输入法会出来,这样,布局会发生变化,所以会触发刚刚所说的事件,因为整个布局中,只有两个EditText会引起布局发生变化,当然还有一个就是当输入法出来的时候,输入法上有一个关闭输入法的按钮,所以就整体来说就只有这三个因素会让布局发生变化,(额,还有返回键,咱不计较它了好吧),所以我可以大胆的预测,刚开始进来的时候,如果,布局发生的变化,一定是点击了其中一个EditText,造成了输入法弹出来的,所以,此时应该讲整体的布局往上推。

    现在问题已经解决了一半了,还有一半是处理输入法的隐藏,我只需要定义一个变量,存储当前输入法是否显示,当第一次布局发生变化的时候,就代表输入法显示了,再一次发生布局变化的时候,一定是输入法隐藏了,这样再对应去处理布局的上推和下拉的动画,不过里面有一个坑,需要自己细心的调试,才能将逻辑捋顺。因为,点击EditText的时候,输入法会弹出来,布局变化的方法触发了一次,与此同时,我们的动画也开启了,这个时候那个方法又会被触发一次,所以里面的逻辑需要好好处理。

    这个小demo呢,我已经托管到Github了,有兴趣研究的同学可以去看下,也不是说技术含量多高,不管怎么样,能在有效的时间内完成任务总归是好的不是么。哈哈

    我是Cretin,一个可爱的小男孩。

    Github地址:https://github.com/MZCretin/PushHeadDemo   

0 0
原创粉丝点击