Android监听键盘弹出收起


      图1 启动界面            图2 未监听键盘弹起           图3 监听键盘弹起

    如图app的登录界面输入账号密码的时候,让登录按钮露出来可以方便用户操作。所以有必要监听键盘弹出收起。

需要了解:
Activity的android:windowSoftInputMode属性
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

    搜到的一些监听键盘的方法必须要windowSoftInputMode属性为adjustResize时才可以用。这个方法不适用与app全屏显示(全屏时布局大小并不会改变)。这个方法主要是实现OnLayoutChangeListener接口。

参考链接

    最终在csdn找到一个类,可以实现监听键盘弹出收起,不用考虑windowSoftInputMode属性与Activity是否全屏。

下载链接

    softkeyboardlistener类:
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();

        //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
        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);
    }
}
    Activity中调用:
SoftKeyBoardListener.setListener(AdjustResizeActivity.this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
            @Override
            public void keyBoardShow(int height) {
                Toast.makeText(AdjustResizeActivity.this, "键盘显示 高度" + height, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void keyBoardHide(int height) {
                Toast.makeText(AdjustResizeActivity.this, "键盘隐藏 高度" + height, Toast.LENGTH_SHORT).show();
            }
        });
    这样就可以监听键盘的弹出收起操作了。可以在keyBoardShow与keyBoardHide函数中写入对布局的操作。
    图中的效果是把最上面的TextView的Height变小,使登录按钮露出。
  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过监听键盘的状态来实现监听键盘弹出。 首先,在你的 AndroidManifest.xml 文件中,给当前的 activity 设置 `android:windowSoftInputMode` 属性为 `adjustResize` 或者 `adjustPan`,以便在键盘弹出时调整界面布局。例如: ```xml <activity android:name=".MainActivity" android:windowSoftInputMode="adjustResize"> ... </activity> ``` 然后,在当前 activity 的代码中,使用 `ViewTreeObserver` 监听布局变化事件,以便在键盘弹出或隐藏时做出相应的处理。具体步骤如下: 1. 获取当前 activity 的根视图(例如,使用 `findViewById(android.R.id.content)` 方法)。 2. 给根视图的 `ViewTreeObserver` 添加一个布局变化监听器(例如,使用 `addOnGlobalLayoutListener()` 方法)。 3. 在监听器的回调方法中,获取当前根视图的高度,并计算出当前键盘的高度。 4. 根据键盘的高度和当前根视图的高度,判断键盘是否弹出,并做出相应的处理(例如,调整界面布局或显示/隐藏某些控件)。 下面是一个示例代码: ```java 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 keyboardHeight = screenHeight - r.bottom; // 判断键盘是否弹出,并做出相应的处理 if (keyboardHeight > screenHeight * 0.15) { // 键盘弹出 // TODO: 处理键盘弹出事件 } else { // 键盘隐藏 // TODO: 处理键盘隐藏事件 } } }); ``` 需要注意的是,由于 Android 版本的不同,键盘弹出时的界面布局调整可能会有所不同。在某些情况下,使用 `adjustPan` 属性可能会更适合,具体可以根据实际情况进行选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值