Android 软键盘弹起引起布局的变化

本文探讨了在Android应用中,当软键盘弹起时如何实现聊天界面类似微信的效果,即界面整体上移。作者尝试了设置AndroidManifest的windowSoftInputMode属性以及通过代码判断软键盘状态的方法,但未能成功。最后通过监听布局变化,自定义LinearLayout并重写onMeasure()、onLayout()和onDraw()方法,成功实现了布局随软键盘弹起而调整的效果。欢迎分享更多解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信微信聊天大家都不陌生,大家在聊天的时候会发现,每次点击输入框后弹起的软键盘,会让当前的聊天界面整体向上移动。这种效果,要如何实现呢?在谷歌了很多资料后,尝试了以下三种方式:
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); 

    } 

这是软键盘没唤起前
这是软键盘没唤起前

软键盘唤起后
软键盘唤起后
从上述变化中,可以看出键盘的弹起确实影响了布局。
所以仿微信的键盘弹起效果也就解决了。
如果各位有更好的解法,请不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值