首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Android中捕获"虚拟键盘显示/隐藏"事件?

在Android中,可以通过监听软键盘的显示和隐藏事件来捕获"虚拟键盘显示/隐藏"事件。以下是一种常用的方法:

  1. 创建一个继承自ViewTreeObserver.OnGlobalLayoutListener接口的监听器类,用于监听布局变化事件:
代码语言:java
复制
public class KeyboardVisibilityListener implements ViewTreeObserver.OnGlobalLayoutListener {
    private final View rootView;
    private final OnKeyboardVisibilityListener onKeyboardVisibilityListener;
    private boolean isKeyboardVisible = false;

    public interface OnKeyboardVisibilityListener {
        void onVisibilityChanged(boolean isVisible);
    }

    public KeyboardVisibilityListener(View rootView, OnKeyboardVisibilityListener onKeyboardVisibilityListener) {
        this.rootView = rootView;
        this.onKeyboardVisibilityListener = onKeyboardVisibilityListener;
    }

    @Override
    public void onGlobalLayout() {
        Rect r = new Rect();
        rootView.getWindowVisibleDisplayFrame(r);
        int screenHeight = rootView.getRootView().getHeight();

        // 计算屏幕高度和可见区域的差值,如果大于一定阈值,则认为键盘显示
        int heightDiff = screenHeight - (r.bottom - r.top);
        boolean isVisible = heightDiff > screenHeight * 0.15;

        if (isVisible != isKeyboardVisible) {
            isKeyboardVisible = isVisible;
            onKeyboardVisibilityListener.onVisibilityChanged(isVisible);
        }
    }
}
  1. 在需要监听键盘显示/隐藏事件的Activity中,使用上述监听器类:
代码语言:java
复制
public class MainActivity extends AppCompatActivity implements KeyboardVisibilityListener.OnKeyboardVisibilityListener {
    private View rootView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rootView = findViewById(android.R.id.content);
        KeyboardVisibilityListener keyboardVisibilityListener = new KeyboardVisibilityListener(rootView, this);
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(keyboardVisibilityListener);
    }

    @Override
    public void onVisibilityChanged(boolean isVisible) {
        if (isVisible) {
            // 虚拟键盘显示
            // 在此处添加处理逻辑
        } else {
            // 虚拟键盘隐藏
            // 在此处添加处理逻辑
        }
    }
}

通过上述方法,我们可以在Android中捕获"虚拟键盘显示/隐藏"事件,并在相应的回调方法中处理相关逻辑。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android开发键盘显示隐藏

本篇内容通过操作软键盘的函数着手详细分析了隐藏或者显示键盘的实现方法,并且对其中重要的代码做了详细分析。 一、开篇 如果有需要用到输入的地方,通常会有需要自动弹出或者收起软键盘的需求。...2.4 切换键盘的弹出和隐藏 在 InputMethodManager ,还提供了一个 toggleSoftInput() 方法,如同它的名字一样,它可以让软键盘显示隐藏之间切换。 ?...这就导致很多时候,我们在代码,无法直接根据 InputMethodManager 提供的方法判断当前软键盘显示状态,这样也就无法确定调用它的时候的效果了。...这里会根据显示隐藏传递的两个 flag 来进行比对,也就是说,如果 flag 使用不正确,可能导致这里直接返回 false ,从而无法隐藏键盘,这些细节对照代码就清晰了,就不在文章里屡这些细节了。...在这个方法,是根据 isInputViewShow() 方法来判定当前软键盘是否处于显示弹出的状态。

2.5K10

详解Android获取软键盘状态和软键盘高度

详解Android获取软键盘状态和软键盘高度 应用场景 在Android应用中有时会需要获取软键盘的状态(即软键盘显示还是隐藏)和软键盘的高度。这里列举了一些可能的应用场景。...场景一 当软键盘显示时,按下返回键应当是收起软键盘,而不是回退到上一个界面,但部分机型在返回键处理上有bug,按下返回键后,虽然软键盘会自动收起,但不会消费返回事件,导致Activity还会收到这次返回事件...注册布局变化监听 在Android当软键盘隐藏变为显示,或由显示变为隐藏时,会触发当前布局View的全局布局变化。通过监听全局布局的变化就可以得知软键盘的状态。...不过并不是只有软键盘显示隐藏会影响窗口的可见区域大小,像大多数的平板和部分手机上有一排虚拟按键(虚拟的返回键,Home键等),虚拟按键的显示隐藏也会引起窗口可见区域的变化。...监听软键盘的状态变化 在获取到软键盘的状态和高度后就可以执行需要的操作了。重新布局按钮位置,设置变量,记录当前软键盘状态和上次软键盘隐藏时间等。

2.7K20

Android虚拟导航键的显示隐藏实例

); break; case R.id.full: //在隐藏显示系统控件的过程不会来移动我们的控件 v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE...2.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION,设置这个Flag可以是虚拟按键进行动态的显示隐藏,因为虚拟按键会占用屏幕控件,所以虚拟按键的显示隐藏可能会影响到你的控件在当前界面的位置...title则需要设置Window.FEATURE_NO_TITLE 如何在带有实体按键的情况下调出虚拟按键 1.通过修改build.prop调出虚拟按键,其路径在system/下,在其中找到build.prop...打开可以看到qemu.hw.mainkeys=1 或者qemu.hw.mainkeys= 0,当qemu.hw.mainkeys=1时实体键盘起效,qemu.hw.mainkeys=0时,显示虚拟键盘,...以上这篇Android虚拟导航键的显示隐藏实例就是小编分享给大家的全部内容了,希望能给大家一个参考。

1.7K20

Android 屏幕横竖切换详解

Android当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载),怎么使屏幕横竖屏切换时,当前的Activity不销毁呢?...2. keyboardHidden:键盘显示隐藏; 3.fontScale: 用户变更了首选的字体大小 4.locale: 用户选择了不同的语言设定; 5. keyboard: 键盘类型变更,...onConfigurationChanged事件只能捕获竖屏变横屏的事件不能捕获横屏变竖屏。...在AndroidManifest.xml添加上述代码的含义是表示在改变屏幕方向、弹出软件盘和隐藏键盘时,不再去执行onCreate()方法,而是直接执行onConfigurationChanged(...如果不申明此段代码,按照Activity的生命周期,都会去执行一次onCreate()方法,而onCreate()方法通常会在显示之前做一些初始化工作。

2.3K30

Qt 常用类 (9)—— QWidget

窗口部件即使获得焦点,也不一定能获得按键事件,因为其他窗口可能会捕获键盘事件。...捕获键盘事件的窗口将得到所有键盘事件,而其他窗口将完全得到不到键盘事件,直到捕获键盘事件的窗口释放键盘事件。...与键盘事件捕获相关的成员函数如下: [plain] view plaincopy void grabKeyboard();           // 捕获键盘事件   void releaseKeyboard...;          // 捕获鼠标事件   void releaseMouse();    // 释放鼠标事件           对键盘事件和鼠标事件捕获是相互独立的。...以下的成员函数能够得到应用程序中正在捕获键盘或鼠标事件的窗口: [plain] view plaincopy QWidget *keyboardGrabber();      // 得到正在捕获键盘事件的窗口

3.5K10

使用Android模拟器预览调试程序

这时Android模拟器就派上用场了。 Android模拟器 Android SDK自带一个移动模拟器。它是一个可以运行在你电脑上的虚拟设备。...Android模拟器提供了大量的导航和控制键,你可以通过鼠标或键盘点击这些按键来为你的应用程序产生事件。同时它还有一个屏幕用于显示Android自带应用程序和你自己的应用程序。...这里你可以选择列表的一个设备,也可以点击“Create New Enulator”按钮创建一个新的虚拟设备,不同型号(屏幕尺寸、Android系统版本)。...如果APP成功编译通过,会在新打开的窗口中看到类似如下界面: 我是为程序添加了一个按钮,添加了点击事件的响应程序,可以直接通过鼠标点击屏幕的按钮触发事件。...发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

2K20

Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)

VirtualDisplay 类似于一个虚拟显示区域,需要结合 DisplayManager 一起调用,一般在副屏显示或者录屏场景下会用到。...VirtualDisplay 会将虚拟显示区域的内容渲染在一个 Surface 上。 ?...在 Android embedding ,该事件的坐标最后会匹配到 AndroidView 在 VirtualDisplay 的坐标,然后会创建一个 MotionEvent 用于 描述触摸的新控件,...而 InputConnections(如何在 Android 输入文本)在 unfocused 的 View 通常是会被丢弃。...由于该机制当前处于开发人员预览,因此该插件也应被视为开发人员预览。 webview_flutter 的键盘支持也尚未准备好用于生产,因为 Webview 键盘支持目前还处于实验性的阶段。

13.3K20

Android监听键盘状态获取键盘高度的实现方法

最近我的一个项目中,在ugc页面需要在键盘顶部,紧贴着键盘显示一个文字提示,当键盘消失时就隐藏. 因此,我需要监听软键盘的打开/关闭 , 以及获取它的高度....当软键盘隐藏变为显示,或由显示变为隐藏时,都会调用当前布局中所有存在的View的ViewTreeObserver对象的dispatchOnGlobalLayout()方法,此方法中会遍历所有已注册的...这个高度可能就是键盘高度了, 为什么说可能呢?因为还么有考虑到顶部的状态栏和底部的虚拟导航栏. 当然也可能不是键盘. 然后我们根据这个高度和之前已知的键盘状态来判断是否为键盘. 并回调给监听者....mError1000tv就是我一开始提到的要紧贴键盘顶部显示的一个textview了....我通过LayoutParams给它设置边距 , 只设置了底部边距 , 值为返回的”键盘高度”- 顶部状态栏高度-虚拟导航栏的高度. 得到真实的键盘高度.

2.1K10

Android适配底部虚拟按键的方法详解

最近项目进行适配的时候发现部分(华为手机)存在底部虚拟按键的手机会因为虚拟按键的存在导致挡住部分界面,因为需要全屏显示,故调用虚拟按键隐藏方法使之隐藏,然而发现出现如下问题: 手动操作隐藏虚拟按键后出现长白条区域...不自动隐藏 滑出状态栏后虚拟按键也出来,状态栏隐藏虚拟却不跟着隐藏 在没有虚拟按键的设备上影响了SurfaceView全屏显示图传(原本全屏显示的图传在切出去再进来时变成了小屏显示) 通过google...之前没有考虑到,导致图传全屏变成小屏显示。...弹出dialog时虚拟按键会出来,此时要手动调用隐藏,还有弹出键盘等等。 记录一下,以后遇到此类问题可供参考。...以上这篇Android适配底部虚拟按键的方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考。

2.5K20

Android屏幕各部分详细介绍

前言 目前,android屏幕上大致分成三个部分:通知栏,内容区、虚拟导航栏(NavigatorBar) 因为这三个区域引起的问题数不胜数,必须好好总结一下 一般情况下,三个区域都显示。...这时候通知栏隐藏,内容区向上扩展。 如果在系统设置开启的虚拟手势,虚拟导航栏就隐藏了。这时候内容区就向下扩展。如果同时满足这两个条件,内容区域就实现了真正意义上的全屏。...+ 通知栏, realHeight = rootView + 通知栏 + NavigatorBar 目前官方没有判断虚拟导航栏显示隐藏的api,网上的都不是完全之法。...,比如键盘弹出时,通过rootView获取的这个rect的高度与实际高度不一致,这样就可以判断出键盘显示隐藏。...但是如果想得到键盘高度,用rootView不行,因为它包含虚拟导航栏,如果用实际高度-显示高度,在虚拟键盘隐藏时得到的高度要大与键盘高度。

1.5K20

深入理解 Android Window系统

Android的窗口系统是应用程序用户界面的核心组件之一,它负责管理可视化区域、处理用户输入事件以及与系统UI交互。...事件分发:Window接收和分发用户输入事件,例如触摸、键盘和手势事件,以便交由适当的View进行处理。...Activity负责定义和管理用户界面的内容,通过方法setContentView来指定要在Window显示的内容。...悬浮窗口:一种浮动在其他窗口上方的窗口,通常用于显示实时信息或小工具。 键盘窗口:用于捕获和处理用户的键盘输入。键盘窗口通常是系统级窗口,由输入法管理器控制。...系统提示框:用于显示系统级提示,权限请求、应用更新等。 创建一个简单的Window 首先,让我们创建一个简单的Android Window,这个Window将包含一个文本视图。

50420

实现Android键盘的中英文适配

“1234567890....android:inputType=”date” 日期键盘 android:inputType=”time” 时间键盘 2、Enter键图标的设置 想象一下,当我们在EditText完成了输入,想要以输入的内容作为关键字进行搜索时...activity里的状态,无论是隐藏还是显示 【C】stateHidden:用户选择activity时,软键盘总是被隐藏 【D】stateAlwaysHidden:当该Activity主窗口获取焦点时...,软键盘也总是被隐藏的 【E】stateVisible:软键盘通常是可见的 【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态 【G】adjustUnspecified...:默认设置,通常由系统自行决定是隐藏还是显示 【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间 【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

2.2K10

XSS平台模块拓展 | 内附42个js脚本源码

01.简单的键盘记录键盘 一个非常简单的键盘记录程序,可捕获击键并将其每秒发送到外部页面.JS和PHP代码在归档中提供的PHP。...这个键盘记录器绝对是JS键盘记录的参考。 03.会话感知键盘记录 感谢设置为cookie的ID的用户会话之后的键盘记录程序。捕获的数据存储在数据库,其中包含与用户会话相关的信息,源URL等。...04.JQuery键盘记录键盘 一旦加载jQuery,一行(长)会写一个键盘记录器。像往常一样,捕获的密钥在制作的URL的查询字符串中发送。在许多情况下可能有用。...这使得钩住所有事件并收集它们以供进一步使用成为可能…… 这绝对超越了键盘记录器的一步。...40.振动 关于如何在Android手机上使用振动API以及可以完成的一些恶意用法的例子。

12.3K80

前端开发JS——jQuery常用方法

13、jQuery键盘事件之keypress()事件 keydown事件触发在文字还没敲进文本框,这时如果在keydown事件输出文本框的文本得到的是触发键盘事件前的文本,而keyup事件触发时整个键盘事件的操作已经完成...keypress与keydown、keyup的主要区别: 只能获取单个字符,不能捕获组合键 无法响应系统功能键(delete,backspace) 不区分小键盘和主键盘的数字字符 14、on()的多事件绑定...important重写样式 2、jQuery显示隐藏切换toggle方法(改变样式display:none/block) toggle方法是上述两个方法的切换 $ele.toggle()...无参数 若元素隐藏,则会显示;若显示,则隐藏 $ele.toggle(options) 动画隐藏显示会慢慢改变宽高,致使页面布局发生改变 options可以传递多个参数,可以字典的形式传递,具体属性及属性值可查阅官方文档...,隐藏从右到左) 设置位置高度 ======>slideToggle 纵向动作(显示从上往下,隐藏从下往上) 设置透明度 ======>fadeToggle

4.8K20

快速解决Android适配底部返回键等虚拟键盘的问题

场景2:进入应用时,虚拟键自动缩回,留下空白区域。 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占满整个屏幕,当用户启用虚拟键时,应用能往上收缩,等于是被底部虚拟按键顶上来。...这一点尤其可用在像华为手机等可以隐藏显示虚拟键盘上导致屏幕变化的手机上。...我一看MainActivity的onCreate方法的setContentView(R.layout.xxxx);之前有下面的代码 //控制底部虚拟键盘 getWindow().getDecorView...这是在虚拟键一直存在的情况下没有问题了,因为nexus不能手动隐藏虚拟键盘,所以我也不清楚是否能在华为等手机上正常运行。TODO。...另外如果想要一直隐藏虚拟键盘,点击屏幕也不会出现的话,将上面的代码换成: //让虚拟键盘一直不显示 Window window = getWindow(); WindowManager.LayoutParams

2K20

了解针对“所有”版本Android的Cloak & Dagger攻击

考虑到安全性方面的问题,这种权限必须用户在设置界面单独的菜单开启才能激活。...根据Android API文档的描述,TYPE_SYTEM_OVERLAY是系统覆盖窗口,它需要显示在所有内容之上,而且不能接收输入焦点。...所以当用户点击了“继续”按钮之后,点击事件将会传递给真实设备管理员激活窗口的“激活”按钮。 ? 二、安全PIN码窃取 当安全屏幕键盘生成辅助事件时,这种攻击就可以执行了。...此时,恶意App需要在虚拟键盘的每一个键上添加额外的透明覆盖层,这些覆盖层不会拦截点击事件,这里需要涉及到键盘的底层设计。...但是在BIND_ACCESSIBILITY_SERVICE权限的帮助下,键盘App本身将会被视作普通的非特权App,而每一个按键所生成的键盘事件都将被记录下来。 ?

85920
领券