返回顶部
首页 > 资讯 > 精选 >Android中如何获取软键盘状态和软键盘高度
  • 495
分享到

Android中如何获取软键盘状态和软键盘高度

android 2023-05-30 20:05:15 495人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Android中如何获取软键盘状态和软键盘高度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。详解Android中获取软键盘状态和软键盘高度应用场景在Android应用中有时会需

这篇文章将为大家详细讲解有关Android中如何获取软键盘状态和软键盘高度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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

应用场景

在Android应用中有时会需要获取软键盘的状态(即软键盘是显示还是隐藏)和软键盘的高度。这里列举了一些可能的应用场景。

场景一

当软键盘显示时,按下返回键应当是收起软键盘,而不是回退到上一个界面,但部分机型在返回键处理上有bug,按下返回键后,虽然软键盘会自动收起,但不会消费返回事件,导致Activity还会收到这次返回事件,执行回退操作,这时就需要判断,如果软键盘刚刚由显示变为隐藏状态,就不执行回退操作。

场景二

当软键盘弹出后,会将界面底部到中间的一大部分全部挡住,如果用户要查看、操作被覆盖的区域,必须先收起软键盘,这会影响用户交互。所以通常需要在软键盘弹出后,将底部的一些View,例如Button,移到软键盘的上方,方便用户操作。

API的困境

Android SDK中没有提供任何api来直接获取软键盘的状态和软键盘的高度,网上很多资料说InputMethodManager的isActive()方法可以获取软键盘状态,不过实际测试发现,这个方法并没有什么用,如果它返回false,可以判断软键盘一定是隐藏的,但如果它返回true,软键盘既可能是显示的,也可能是隐藏的。所以并不能通过isActive()方法来判断软键盘究竟是显示还是隐藏的。要想获取软键盘的状态和软键盘的高度,只能通过间接方法实现。

注册布局变化监听

在Android中当软键盘由隐藏变为显示,或由显示变为隐藏时,会触发当前布局中View的全局布局变化。通过监听全局布局的变化就可以得知软键盘的状态。

Android框架提供了一个ViewTreeObserver类,它是一个View视图树的观察者类。ViewTreeObserver类中定义了一系列的公共接口(public interface)。当一个View attach到一个窗口上时就会创建一个ViewTreeObserver对象,这样当一个View的视图树发生改变时,就会调用该对象的某个方法,将事件通知给每个注册的监听者。

OnGlobalLayoutListener是ViewTreeObserver中定义的众多接口中的一个,它用来监听一个视图树中全局布局的改变或者视图树中的某个视图的可视状态的改变。当软键盘由隐藏变为显示,或由显示变为隐藏时,都会调用当前布局中所有存在的View中的ViewTreeObserver对象的dispatchOnGlobalLayout()方法,此方法中会遍历所有已注册的OnGlobalLayoutListener,执行相应的回调方法,将全局布局改变的消息通知给每个注册的监听者。

向一个View中的ViewTreeObserver注册OnGlobalLayoutListener的方法如下。

view.getViewTreeObserver().addOnGlobalLayoutListener(listener);

注册OnGlobalLayoutListener时有一些需要注意的地方。

  • 注册的监听在不使用时需要调用removeOnGlobalLayoutListener或removeGlobalOnLayoutListener来移除监听,不然可能会导致内存泄露。通常可以在Activity的onCreate()方法中注册监听,在onDestory()方法中移除监听。

  • 并不是只有显示和隐藏软键盘会触发OnGlobalLayoutListener中的回调,一个View在绘制完成,或者消失时都会触发OnGlobalLayoutListener中的回调(由于在onCreate中无法获取一个View的宽度和高度,很多时候就是通过注册OnGlobalLayoutListener,在OnGlobalLayoutListener的回调中来获取一个View的宽度和高度)。

为了在OnGlobalLayoutListener的回调中准确的判断是否是由于软键盘状态改变引起的,以及获取软键盘的高度,还需要另外一个接口。

获取当前窗口可见的显示区域大小

在View中提供了一个方法getWindowVisibleDisplayFrame(),此方法会返回该view所附着的窗口的可见区域大小。当软键盘显示时,窗口的可见区域大小会被压缩,当软键盘隐藏时,窗口的可见区域大小会还原。不过并不是只有软键盘的显示和隐藏会影响窗口的可见区域大小,像大多数的平板和部分手机上有一排虚拟按键(虚拟的返回键,Home键等),虚拟按键的显示和隐藏也会引起窗口可见区域的变化。不过好在除了软键盘外,其他操作对窗口可见区域的影响占整个屏幕大小的比例都不是很大,通过设置一个合理的阈值,就可以较准确的判断出是否是软键盘显示和隐藏引起的布局变化。
此外,getWindowVisibleDisplayFrame()会返回窗口的可见区域高度,通过和屏幕高度相减,就可以得到软键盘的高度了。

监听软键盘的状态变化

在获取到软键盘的状态和高度后就可以执行需要的操作了。如重新布局按钮位置,设置变量,记录当前软键盘状态和上次软键盘隐藏时间等。不过如果有多个类需要根据软键盘状态来执行一些操作,如果每个类中都去这样做一遍就很麻烦,而且也没有必要。这时在可以自行定义一个接口,在主Activity中对软键盘状态变化进行监听,其他对软键盘状态感兴趣的类,向主Activity中注册软键盘状态变化监听。在主Activity中,当软键盘状态发生改变时通知监听者。

完整示例代码

完整的示例代码如下。

public interface OnSofTKEyboardStateChangedListener {  public void OnSoftKeyboardStateChanged(boolean isKeyBoardShow, int keyboardHeight);}//注册软键盘状态变化监听public void addSoftKeyboardChangedListener(OnSoftKeyboardStateChangedListener listener) {  if (listener != null) {    mKeyboardStateListeners.add(listener);  }}//取消软键盘状态变化监听public void removeSoftKeyboardChangedListener(OnSoftKeyboardStateChangedListener listener) {  if (listener != null) {    mKeyboardStateListeners.remove(listener);  }}private ArrayList<OnSoftKeyboardStateChangedListener> mKeyboardStateListeners;   //软键盘状态监听列表private OnGlobalLayoutListener mLayoutChangeListener;private boolean mIsSoftKeyboardShowing;@Overrideprotected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_login);  mIsSoftKeyboardShowing = false;  mKeyboardStateListeners = new ArrayList<OnSoftKeyboardStateChangedListener>();  mLayoutChangeListener = new OnGlobalLayoutListener() {    @Override    public void onGlobalLayout() {      //判断窗口可见区域大小      Rect r = new Rect();      getWindow().getDecorView().getWindowVisibleDisplayFrame(r);      //如果屏幕高度和Window可见区域高度差值大于整个屏幕高度的1/3,则表示软键盘显示中,否则软键盘为隐藏状态。      int heightDifference = screenHeight - (r.bottom - r.top);      boolean isKeyboardShowing = heightDifference > screenHeight/3;      //如果之前软键盘状态为显示,现在为关闭,或者之前为关闭,现在为显示,则表示软键盘的状态发生了改变      if ((mIsSoftKeyboardShowing && !isKeyboardShowing) || (!mIsSoftKeyboardShowing && isKeyboardShowing)) {        mIsSoftKeyboardShowing = isKeyboardShowing;        for (int i = 0; i < mKeyboardStateListeners.size(); i++) {          OnSoftKeyboardStateChangedListener listener = mKeyboardStateListeners.get(i);          listener.OnSoftKeyboardStateChanged(mIsSoftKeyboardShowing, heightDifference);        }      }    }  };  //注册布局变化监听  getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(mLayoutChangeListener);}@SuppressWarnings("deprecation")@SuppressLint("NewApi")@Overrideprotected void onDestroy() {  //移除布局变化监听  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {    getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(mLayoutChangeListener);  } else {    getWindow().getDecorView().getViewTreeObserver().removeGlobalOnLayoutListener(mLayoutChangeListener);  }  super.onDestroy();};

其中screenHeight 是屏幕高度,关于屏幕高度的获取方法,网上有很多,这里就不介绍了。

Android是什么

Android是一种基于linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发

关于“Android中如何获取软键盘状态和软键盘高度”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Android中如何获取软键盘状态和软键盘高度

本文链接: https://lsjlt.com/news/220725.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中如何获取软键盘状态和软键盘高度
    这篇文章将为大家详细讲解有关Android中如何获取软键盘状态和软键盘高度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。详解Android中获取软键盘状态和软键盘高度应用场景在Android应用中有时会需...
    99+
    2023-05-30
    android
  • Android监听键盘状态获取键盘高度的实现方法
    前言 Android暂时还没有提供一个合适的API来获取/监听键盘的状态和高度 , 而我们又经常会有这个需求. 最近我的一个项目中,在ugc页面需要在键盘顶部,紧贴着键盘显示一...
    99+
    2022-06-06
    方法 Android
  • Android判断软键盘的状态和隐藏软键盘的简单实例
    之前本人也遇到一个关于获取软键盘的状态的问题,在网上找了很多资料,基本上回答都是用getWindow().getAttributes().softInputMode==Wind...
    99+
    2022-06-06
    软键盘 Android
  • Android中怎么监听软键盘状态
    本篇文章为大家展示了Android中怎么监听软键盘状态,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android 监听软键盘状态的实例详解activityRoot是activity的根view,就...
    99+
    2023-05-30
    android
  • Android中监听软键盘显示状态实现代码
    public static void addOnSoftKeyBoardVisibleListener(Activity activity, final OnSoftK...
    99+
    2022-06-06
    监听 软键盘 Android
  • Android软键盘状态弹出与消失的示例
    最近遇到了关于软键盘的问题,需要获取到软键盘的状态,是否在显示 ,记录一下,方便以后查阅。网上常见的判定状态方法 代码如下: getWindow().getAttribut...
    99+
    2022-06-06
    示例 Android
  • 电脑中键盘损坏如何打开软键盘
    小编给大家分享一下电脑中键盘损坏如何打开软键盘,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先打开控制面板,将查看方式改为“大图标”,然后选择“轻松访问中心”。...
    99+
    2023-06-28
  • Android 设置Edittext获取焦点并弹出软键盘
    Android 设置Edittext获取焦点并弹出软键盘 public static void showSoftInputFromWindow(Activity act...
    99+
    2022-06-06
    edittext 软键盘 Android
  • jQuery如何获取键盘按键?
    这篇文章将为大家详细讲解有关jQuery如何获取键盘按键?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jQuery 获取键盘按键 概述 jQuery 提供了多种方法来获取键盘事件中的按键信息。这些方法可...
    99+
    2024-04-02
  • C#如何打开软键盘
    这篇文章主要介绍了C#如何打开软键盘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。注:程序是在VS2005里面,注意一下。控件需要自己添加了。一个ComboBox,一个Tex...
    99+
    2023-06-17
  • Android软键盘状态并隐藏输入法的示例分析
    这篇文章主要介绍了Android软键盘状态并隐藏输入法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Android 软键盘状态并隐藏输入法的实例1 软键盘状态的切换...
    99+
    2023-05-30
    android
  • Android获取屏幕方向及键盘状态的小例子
    代码如下:  Configuration config = getResources().getConfiguration();  if (config.orientatio...
    99+
    2022-06-06
    Android
  • 电脑如何打开软键盘
    电脑通常没有物理的软键盘,但可以通过以下方式打开虚拟软键盘:1. 在 Windows 操作系统中,点击任务栏右下角的语言栏图标(通常...
    99+
    2023-09-07
    电脑
  • win7的软键盘如何打开
    这篇“win7的软键盘如何打开”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win7的软键盘如何打开”文章吧。win7的软键...
    99+
    2023-07-01
  • win7软键盘如何调出来
    本文小编为大家详细介绍“win7软键盘如何调出来”,内容详细,步骤清晰,细节处理妥当,希望这篇“win7软键盘如何调出来”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 方法一:...
    99+
    2023-02-07
    win7
  • Android如何实现数字九宫格软键盘
    这篇文章主要介绍了Android如何实现数字九宫格软键盘,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言一开始大概是这种需求组长说 要不搞一个自定义软键盘吧 数字搞大点 方...
    99+
    2023-06-15
  • 如何在Android项目中显示与隐藏软键盘
    本篇文章为大家展示了如何在Android项目中显示与隐藏软键盘,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、软键盘显示的原理    软件盘的本质是什么?软键盘其实是...
    99+
    2023-05-31
    android roi 目中
  • Win10系统如何打开软键盘
    这篇文章主要介绍“Win10系统如何打开软键盘”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Win10系统如何打开软键盘”文章能帮助大家解决问题。方法一:按“win+i”组合键,打开Windows设...
    99+
    2023-06-27
  • win7系统如何打开软键盘
    这篇文章将为大家详细讲解有关win7系统如何打开软键盘,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、打开开始菜单,点击进入控制面板。二、在弹出的控制面板窗口,打开轻松访问。三、在轻松访问页面,继续打开...
    99+
    2023-06-28
  • win10开机软键盘如何关掉
    要关闭Windows 10开机软键盘,您可以按照以下步骤操作:1. 打开“设置”:点击“开始”菜单,然后点击“设置”图标(齿轮形状)...
    99+
    2023-09-07
    win10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作