Java代码动态设置SoftInputMode,友好进行底部界面呈现

前几天在定制短信应用,其中我们经过讨论把短信编辑界面的添加各类附件入口,由原来弹框的形式改为类似微信底部添加附件的方式。涉及到软键盘的呈现以及附件界面的呈现,以及它们之间的切换。如下这几种情况:

这里写图片描述
这个时候如果我点击输入框,希望软键盘能够把聊天界面往上顶起。

这里写图片描述
这个时候如果我点击输入框,希望软键盘能够覆盖在附件界面之上

这里写图片描述
这种时候如果我点击右方的加号按钮,我希望软键盘隐藏,附件直接出现。
如果我按返回按键或者输入法下箭头,整个聊天界面下移到正常。

首先我们先了解软键盘呈现的方式,方式可以在AndroidManifest.xml里面进行配置,
adjustNothing 布局不变,软键盘覆盖当前布局
adjustResize 布局会被软键盘顶起,布局高度缩小
adjustPan 布局高度不变,上移动,腾出足够空间给软键盘,ActionBar上移
adjustUnspecified 系统根据条件选择adjustResize 和 adjustPan

这几种方式也可以在代码里通过调用当前窗口的setSoftInputMode方法进行设置。

了解了以上,我们知道如果想要满足需求,我们有以下几方面需要做到:
1、获取软键盘的高度并且设置附件的高度与它一致
2、在不同的条件下,让软键盘以不同的方式呈现

获取软键盘的高度

有以下两种方式:
1、

        getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //获取屏幕的高度
                int screenHeight = ((Activity)context).getWindowManager().getDefaultDisplay().getHeight();
                Rect rect = new Rect();
                getWindowVisibleDisplayFrame(rect); // 获取可见区域
                if (screenHeight - rect.bottom > 0.4 * screenHeight) {
                    int softInputHeight = screenHeight - rect.bottom;
                    // 通知对附件的高度进行计算等
                }
            }
        });

2、
在最外层布局的onSizeChanged回调方法中,告知监听者高度已改变,由监听者去计算软键盘的高度,分两部分,
a、自定义HeightChangedLinearLayout布局,重写onSizeChanged方法

public class HeightChangedLinearLayout extends LinearLayout {
   
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        if (DEBUG)Log.d(TAG, "onSizeChanged(): oldw = " + oldw + ", oldh = " + oldh
                + ",w = " + w + ", h = " + h);
        final int fw = w;
        final int fh = h;
        final int fow = oldw;
        final 
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值