Android 监听手机键盘打开和关闭状态

转载 2017年09月14日 14:19:18
工具类:

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

import java.util.LinkedList;
import java.util.List;

public class SoftKeyboardStateHelper implements ViewTreeObserver.OnGlobalLayoutListener {

    public interface SoftKeyboardStateListener {
        void onSoftKeyboardOpened(int keyboardHeightInPx);
        void onSoftKeyboardClosed();
    }

    private final List<SoftKeyboardStateListener> listeners = new LinkedList<SoftKeyboardStateListener>();
    private final View activityRootView;
    private int        lastSoftKeyboardHeightInPx;
    private boolean    isSoftKeyboardOpened;

    public SoftKeyboardStateHelper(View activityRootView) {
        this(activityRootView, false);
    }

    public SoftKeyboardStateHelper(View activityRootView, boolean isSoftKeyboardOpened) {
        this.activityRootView     = activityRootView;
        this.isSoftKeyboardOpened = isSoftKeyboardOpened;
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }

    @Override
    public void onGlobalLayout() {
        final Rect r = new Rect();
        //r will be populated with the coordinates of your view that area still visible.
        activityRootView.getWindowVisibleDisplayFrame(r);

        final int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
        if (!isSoftKeyboardOpened && heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
            isSoftKeyboardOpened = true;
            notifyOnSoftKeyboardOpened(heightDiff);
        } else if (isSoftKeyboardOpened && heightDiff < 100) {
            isSoftKeyboardOpened = false;
            notifyOnSoftKeyboardClosed();
        }
    }

    public void setIsSoftKeyboardOpened(boolean isSoftKeyboardOpened) {
        this.isSoftKeyboardOpened = isSoftKeyboardOpened;
    }

    public boolean isSoftKeyboardOpened() {
        return isSoftKeyboardOpened;
    }

    /**
     * Default value is zero (0)
     * @return last saved keyboard height in px
     */
    public int getLastSoftKeyboardHeightInPx() {
        return lastSoftKeyboardHeightInPx;
    }

    public void addSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
        listeners.add(listener);
    }

    public void removeSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
        listeners.remove(listener);
    }

    private void notifyOnSoftKeyboardOpened(int keyboardHeightInPx) {
        this.lastSoftKeyboardHeightInPx = keyboardHeightInPx;

        for (SoftKeyboardStateListener listener : listeners) {
            if (listener != null) {
                listener.onSoftKeyboardOpened(keyboardHeightInPx);
            }
        }
    }

    private void notifyOnSoftKeyboardClosed() {
        for (SoftKeyboardStateListener listener : listeners) {
            if (listener != null) {
                listener.onSoftKeyboardClosed();
            }
        }
    }

调用方法:

SoftKeyboardStateHelper softKeyboardStateHelper = new SoftKeyboardStateHelper(activity_main_layout);
softKeyboardStateHelper.addSoftKeyboardStateListener(new SoftKeyboardStateHelper.SoftKeyboardStateListener() {
    @Override
    public void onSoftKeyboardOpened(int keyboardHeightInPx) {

//开启 
}

    @Override
    public void onSoftKeyboardClosed() {
 
//关闭
}});



android 获取手机屏幕状态(唤醒睡眠)

前面写过一篇手机屏幕状态监听的文章:手机屏幕状态监听 广播只有在触发的时候才会做一次,有些时候要知道当前手机屏幕处于什么状态。   PowerManager.isScreenOn()方法;这个方...
  • yueguanyun
  • yueguanyun
  • 2013年07月24日 15:06
  • 2609

Android锁屏状态获取音量按键事件

目前Android系统无法通过广播在后台获得音量按键事件实现程序后台获取音量键的方法设计思路: 开一个子线程,持续判断当前音量值和之前音量值是否一致,如果不同说明按下了音量键, 但要考虑音量的上下限。...
  • u011370871
  • u011370871
  • 2015年01月19日 14:26
  • 3931

Android监听软键盘开启关闭状态

最近公司项目有一个功能点是监听软键盘的打开关闭状态,然后来展开不同的布局,后来在StackOverFlow上面找到一位大神提供了解决办法,大致做法如下: 在你需要监听状态的界面activity或者f...
  • u013700040
  • u013700040
  • 2017年02月15日 16:53
  • 444

Android输入法界面管理(打开/关闭/状态获取)

最近做一个带发表情的聊天界面,需要管理系统输入法的状态,  一、打开输入法窗口: [java] view plain copy InputMethod...
  • u014320421
  • u014320421
  • 2016年10月19日 14:20
  • 722

安卓监听输入法键盘打开关闭(兼容虚拟按键栏的手机,比如华为)

可以监听输入法键盘的打开和关闭动作,通过回调精准判断,兼容几乎所有手机原理:在输入法打开和关闭的时候会引起当前界面的高度变化,从而出发onLayout方法,所以我们监听layout动作,当触发此方法时...
  • qq_31340657
  • qq_31340657
  • 2016年12月28日 14:39
  • 1719

Android调用系统键盘的方法

http://www.cnblogs.com/android100/p/android-soft-keyboard.html
  • u013144863
  • u013144863
  • 2016年05月29日 14:33
  • 4499

Android App监听软键盘按键的三种方式

我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面;在点击搜索框的时候,点击右下角的search符号键...
  • jdsjlzx
  • jdsjlzx
  • 2014年02月08日 10:57
  • 12979

Android 打开关闭键盘以及监听的工具类

public class KeyboardUtil { /** * 展示输入法软键盘 * * @param activity * @param cur...
  • Hello_MR_Li
  • Hello_MR_Li
  • 2017年09月02日 16:25
  • 224

史上最全:安卓监听软键盘打开或者关闭

史上最全:安卓监听软键盘打开或者关闭SoftKeyboard open and close listener in an activity in Android?问题:我有一个Activity,里面有...
  • gusgao
  • gusgao
  • 2016年09月11日 16:43
  • 9700

Util:打开或关闭软键盘

public class KeyBoardUtils{ /** * 打开软键盘 * @param mEditText输入框 * @param mContext上下文 */ public s...
  • u014157740
  • u014157740
  • 2015年08月22日 17:48
  • 175
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 监听手机键盘打开和关闭状态
举报原因:
原因补充:

(最多只允许输入30个字)