相信微信聊天大家都不陌生,大家在聊天的时候会发现,每次点击输入框后弹起的软键盘,会让当前的聊天界面整体向上移动。这种效果,要如何实现呢?在谷歌了很多资料后,尝试了以下三种方式:
1.直接在AndroidManifest中修改android:windowSoftInputMode=”stateAlwaysHidden|adjustPan”
然而修改完后运行,依然没啥用处。
2.//判断隐藏软键盘是否弹出 if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
//隐藏软键盘 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}
然而结果却是params.softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE的判断总是false。(o(╯□╰)o~~~OTZ)
在试了两次之后,仔细回顾了一下键盘弹起的过程,看看有什么关键点漏了,于是在微信聊天窗口不断点击输入栏弹起键盘,然后又点击回退键隐藏键盘,企图在一起一落间找到思考的方向。就在一瞬间,头脑里闪过了一个点:布局的变化。对,监听布局的变化,每次键盘弹起后整个界面都往上顶了,按照view的渲染原理来说,肯定要触发onMeasure(),onLayout()进而再onDraw()的。于是乎,按照这个思路,自定义了一个LinearLayout,继承了以下几个函数:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Log.e("sizechange",String.valueOf(w)+" "+String.valueOf(h)+" "+String.valueOf(oldw)+" "+String.valueOf(oldh));
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
Log.e("onLayout",String.valueOf(l)+" "+String.valueOf(t)+" "+String.valueOf(r)+" "+String.valueOf(b));
super.onLayout(changed, l, t, r, b);
// con.startService(new Intent(con,MusicService.class));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
这是软键盘没唤起前
软键盘唤起后
从上述变化中,可以看出键盘的弹起确实影响了布局。
所以仿微信的键盘弹起效果也就解决了。
如果各位有更好的解法,请不吝赐教。