Android软键盘和底部面板的无缝切换

开局就是二张图。先看效果是不是自己想要的,然后再慢慢往下看。第一张图是默认高度,第二张图是高度增加之后的变化。可以看到,切换还是蛮顺畅的,没有出现跳闪的情况。 这两天在弄一个留言板功能,可进行文字、语音、图片还有其他功能的留言。这时就需要一个面板来存放这些附加功能。一般都是输入框旁边有个加号,来进行面板的弹出。但是我当我底部面板出现时,会出现跳闪问题,就是面板和输入框会被软键盘顶到上面去,然后等软键盘...
摘要由CSDN通过智能技术生成

开局就是二张图。先看效果是不是自己想要的,然后再慢慢往下看。第一张图是默认高度,第二张图是高度增加之后的变化。可以看到,切换还是蛮顺畅的,没有出现跳闪的情况。         

      

这两天在弄一个留言板功能,可进行文字、语音、图片还有其他功能的留言。这时就需要一个面板来存放这些附加功能。一般都是输入框旁边有个加号,来进行面板的弹出。但是我当我底部面板出现时,会出现跳闪问题,就是面板和输入框会被软键盘顶到上面去,然后等软键盘收起来,面板才降下来,这种效果体验起来不是很好,就先自己想了想,但也没想到好的解决办法,又看了看微信、QQ、支付宝的聊天界面,体验效果很好,并且当软键盘的高度变化时,面板的高度也会随之变化。体验效果很好。

        算了,还是百度,搜了搜知道了大致的解决方案。就是当面板和输入框切换时去改变软键盘的显示模式。一般我们改变软键盘的显示模式都是在清单文件AndroidManifest.xml中对Activity的windowSoftInputMode标签进行修改。但这次我们需要在代码总动态的去改变。主要是针对这两种模式进行改变。如下

当属性为adjustResize的时候,软键盘弹出时会挤压Activity窗口大小,这样可以保证输入法不会覆盖到输入框;

当属性为adjustNothing的时候,软键盘弹出时会覆盖到当前窗口上,窗口大小不变,这种情况输入法有可能会覆盖输入框。

知道解决的关键点之后,还需知道软键盘的高度,以及软键盘的隐藏和显示状态。这样就可以对不同的情况进行相应的改变。

先上代码获取软键盘的高度和显示、隐藏状态的代码。

public class KeyboardLayout extends FrameLayout {

    private KeyboardLayoutListener mListener;
    private boolean mIsKeyboardActive = false; // 输入法是否激活
    private int mKeyboardHeight = 0; // 输入法高度

    public KeyboardLayout(Context context) {
        this(context, null, 0);
    }

    public KeyboardLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public KeyboardLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // 监听布局变化
        getViewTreeObserver().addOnGlobalLayoutListener(new KeyboardOnGlobalChangeListener());
    }

    private class KeyboardOnGlobalChangeListener implements ViewTreeObserver.OnGlobalLayoutListener {

        int mScreenHeight = 0;

        private int getScreenHeight() {
            if (mScreenHeight > 0) {
                return mScreenHeight;
            }
            mScreenHeight = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
                    .getDefaultDisplay().getHeight();
            return mScreenHeight;
        }

        @Override
        public void onGlobalLayout() {
            Rect rect = new Rect();
            // 获取当前页面窗口的显示范围
            ((Activity) getContext()).getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
            int screenHeight = getScreenHeight();
            int keyboardHeight = screenHeight - rect.bottom; // 输入法的高度
            boolean isActive 
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值