欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android中监听软键盘的弹出与隐藏,并获取软键盘的高度

程序员文章站 2022-03-02 14:36:37
...

最近项目中有一个需求上弹出软键盘的时候,输入框位移至输入框上方,但是Activity中其他的VIew都不动。这个需求需要监听软软键盘的弹出与隐藏,并获取键盘的高度。上网找了一下发现,Android竟然没有提供相应的接口。网上找到的替代方法中最常用的就是自定义根试图从写onSizeChanged方法,这是链接。但是这种方法需要设置android:windowSoftInputMode="adjustResize",就是说键盘弹出时候,activity的布局会被压缩,与我需要的弹出后其他布局不动的需求不相同。只好自己另外想方法了。

要实现这样的功能,需要解决两个问题。

1.需要一个在软键盘弹出的时候,必然会触发的事件

2.判断键盘是弹出还是隐藏,并获取键盘高度


监听的事件,我选择了ViewTreeObserver中的OnGlobalLayoutListener事件,这个事件在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时会被处罚,而软键盘的弹出和隐藏很明显会影响到根视图的可视状态(一部分被软键盘遮挡了)。

  判断键盘是弹出还是隐藏,这个只要判断根视图可视高度是变大还是变小就行,变化的高度就是软键盘的高度了。

  下面提供实现的核心代码
 

package com.sharetronic.util;

import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;

/**
 * Created by Administrator on 2018/10/18.
 * 软键盘的监听
 */

public class SoftKeyBoardListener {
    private View rootView;//activity的根视图
    int rootViewVisibleHeight;//纪录根视图的显示高度
    private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;

    public SoftKeyBoardListener(Activity activity) {
        //获取activity的根视图
        rootView = activity.getWindow().getDecorView();

        //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //获取当前根视图在屏幕上显示的大小
                Rect r = new Rect();
                rootView.getWindowVisibleDisplayFrame(r);
                int visibleHeight = r.height();
                if (rootViewVisibleHeight == 0) {
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }

                //根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
                if (rootViewVisibleHeight == visibleHeight) {
                    return;
                }

                //根视图显示高度变小超过200,可以看作软键盘显示了
                if (rootViewVisibleHeight - visibleHeight > 200) {
                    if (onSoftKeyBoardChangeListener != null) {
                        onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
                    }
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }

                //根视图显示高度变大超过200,可以看作软键盘隐藏了
                if (visibleHeight - rootViewVisibleHeight > 200) {
                    if (onSoftKeyBoardChangeListener != null) {
                        onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);
                    }
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }

            }
        });
    }

    private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
        this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
    }

    public interface OnSoftKeyBoardChangeListener {
        void keyBoardShow(int height);

        void keyBoardHide(int height);
    }

    public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
        SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
        softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
    }
}

在Activity中使用:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_adjust);
        SoftKeyBoardListener.setListener(AdjustUnspecifiedActivity.this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() <span style="white-space:pre">	</span>{
            @Override
            public void keyBoardShow(int height) {
                Toast.makeText(AdjustUnspecifiedActivity.this, "键盘显示 高度" + height, Toast.LENGTH_SHORT).show();
            }
 
            @Override
            public void keyBoardHide(int height) {
                Toast.makeText(AdjustUnspecifiedActivity.this, "键盘隐藏 高度" + height, Toast.LENGTH_SHORT).show();
            }
        });
    }

参考于:https://blog.csdn.net/l448288137/article/details/49403777