Android监听键盘弹出收起

本文介绍了一种在Android应用中监听软键盘弹出与隐藏的方法,通过监听根视图的高度变化,当高度变化超过200px时,判断为软键盘的显示或隐藏。提供了详细的代码实现,便于开发者在项目中直接使用。

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

在日常需求中,有一个需要监听键盘得需求,监听键盘得方案有很多,网上出现得有自定义view,监听layout重新布局,查看位置变化,来键盘确定是否弹出。也有使用ViewTreeObserver.OnGlobalLayoutListener,监听根布局得大小变化,究其根本都是监听控件高度变化。在网上溜达了一圈,觉得以下得封装还不错,直接使用。200px左右变化,视作键盘弹出。这个阈值可改,根据屏幕百分比来调节等等都可以。

**

【鬼刀镇贴】

**
在这里插入图片描述

package com.ljh.softkeyboardlistener;
 
import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.Toast;
 
/**
 * Created by liujinhua on 15/10/25.
 */
public class SoftKeyBoardListener {
    private View rootView;//activity的根视图
    int rootViewVisibleHeight;//纪录根视图的显示高度
    private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;
 
    public SoftKeyBoardListener(Activity activity) {
        //获取activity的根视图
        rootView = activity.getWindow().getDecorView();
 		Rect r = new Rect();
        rootView.getWindowVisibleDisplayFrame(r);
        rootViewVisibleHeight = r.height();
        //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //获取当前根视图在屏幕上显示的大小
                Rect r = new Rect();
                rootView.getWindowVisibleDisplayFrame(r);
 
                int visibleHeight = r.height();
                System.out.println(""+visibleHeight);
                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);
    }
}

SoftKeyBoardListener.setListener(AppActivity.this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
            @Override
            public void keyBoardShow(int height) {
                Toast.makeText(AppActivity.this, "键盘显示 高度" + height, Toast.LENGTH_SHORT).show();
            }
 
            @Override
            public void keyBoardHide(int height) {
                Toast.makeText(AppActivity.this, "键盘隐藏 高度" + height, Toast.LENGTH_SHORT).show();
            }
        });

出处:https://blog.youkuaiyun.com/auccy/article/details/80664234
https://download.youkuaiyun.com/download/l448288137/9211443

### Android 应用中监听键盘弹出事件 为了检测软键盘的打开和关闭状态,在 `Activity` 或者 `Fragment` 中可以通过重写布局视图的高度变化来实现这一功能。当软键盘弹出时,窗口可视区域高度会减少;而当软键盘收起时,该高度又恢复正常。 一种常用的方式是在根布局容器上设置一个全局布局监听器: ```java final View rootView = findViewById(android.R.id.content); rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); int screenHeight = rootView.getRootView().getHeight(); int keypadHeight = screenHeight - r.bottom; if (keypadHeight > screenHeight * 0.15) { // 如果屏幕底部到可见部分的距离超过一定阈值,则认为是软键盘显示 // 软键盘弹出 } else { // 软键盘已被隐藏 } } }); ``` 另一种方法是利用 `SoftKeyboardStateHelper` 类(需自行定义),它能够更方便地处理这类逻辑[^1]。 对于更高版本的 API Level (如API level 30及以上),可以考虑使用新的 WindowInsets API 来监测输入法面板的状态改变: ```kotlin val view = window.decorView.rootView view.setOnApplyWindowInsetsListener { v, insets -> val imeBottom = insets.getInsets(WindowInsets.Type.ime()).bottom if (imeBottom > 0){ // Soft Keyboard is visible }else{ // Soft Keyboard is hidden } insets } ``` 上述两种方式都可以有效地帮助开发者捕捉到软键盘的变化情况并作出相应反应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值