可以监听输入法键盘的打开和关闭动作,通过回调精准判断,兼容几乎所有手机

原理:

在输入法打开和关闭的时候会引起当前界面的高度变化,从而出发onLayout方法,所以我们监听layout动作,当触发此方法时,判断当前界面可视部分的高度变化
package com.shixi.didihr.utils;import android.app.Activity;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.ViewTreeObserver;import java.lang.reflect.Method;/*** Created by Miller Zhang  on 2016/12/27.* desc:* github:https://github.com/zxyaust  CSDN:http://blog.csdn.net/qq_31340657* Whatever happens tomorrow,we've had today.*/public class ScreenUtil {private final Activity activity;private OnInputActionListener listener;public ScreenUtil(Activity activity) {this.activity = activity;}/*** @return 底部的虚拟栏的高度*/public int getBottomKeyboardHeight() {int screenHeight = getAccurateScreenDpi()[1];DisplayMetrics dm = new DisplayMetrics();activity.getWindowManager().getDefaultDisplay().getMetrics(dm);//去除底部虚拟栏之后的metricint heightDifference = screenHeight - dm.heightPixels;return heightDifference;}/*** 获取实际的屏幕尺寸,所有的连同底部虚拟栏*/public int[] getAccurateScreenDpi() {int[] screenWH = new int[2];Display display = activity.getWindowManager().getDefaultDisplay();DisplayMetrics dm = new DisplayMetrics();try {Class<?> c = Class.forName("android.view.Display");Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);method.invoke(display, dm);screenWH[0] = dm.widthPixels;screenWH[1] = dm.heightPixels;} catch (Exception e) {e.printStackTrace();}return screenWH;}/*** 监听某个页面上输入法键盘打开动作** @param view     要实现监听的页面上的任意一个view都可以* @param listener 监听接口*/public void observeInputlayout(final View view, OnInputActionListener listener) {this.listener = listener;view.postDelayed(new Runnable() {@Overridepublic void run() {observe(view);}}, 500);}private void observe(View view) {view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {//当键盘弹出隐藏的时候会 调用此方法。@Overridepublic void onGlobalLayout() {Rect r = new Rect();//获取当前界面可视部分activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);//获取屏幕的高度int screenHeight = activity.getWindow().getDecorView().getRootView().getHeight();//此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数int heightDifference = screenHeight - r.bottom;if (heightDifference > getBottomKeyboardHeight()) {//有些手机用的是底部虚拟键,所以要大于虚拟键的高度listener.onOpen();} else {listener.onClose();}}});}public interface OnInputActionListener {void onOpen();void onClose();}}

使用方法:

把上面的类复制到自己项目里面,然后调用下面方法:
new ScreenUtil(getActivity()).observeInputlayout(view, new ScreenUtil.OnInputActionListener() {@Overridepublic void onOpen() {startAniout();}@Overridepublic void onClose() {startAniIn();}});

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

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

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

  2. android 隐藏输入法时自动关闭弹窗,Android监听输入法弹窗和关闭的实现方法

    用过ios的都知道ios上输入法关闭的同时会自动关闭输入框,那么在android上如何实现监听输入法弹出和关闭呢?本篇文章就为你提供了一种可靠的实现方式. 首先在AndroidManifest中配置 ...

  3. android 键盘隐藏监听,安卓监听软键盘弹出与隐藏的两种方法

    需求: 现在有一个需求是点击一行文本框,弹出一个之前隐藏的输入框,输入完成后按返回键或者其他的东西隐藏键盘和输入框,将输入框的内容填充到文本框中. 实现: 拿到这个需求的第一反应就是写一个监听来监听键 ...

  4. 安卓监听软键盘搜索键

    1.EditText中添加**android:imeOptions="actionSearch"  android:singleLine="true"**两行, ...

  5. 【Android应用】【监听软键盘弹起与关闭】

    [背景] 在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹 ...

  6. Android App监听软键盘按键的三种方式 以及 输入法删除退格键的冲突问题解决

    输入法删除退格键的冲突问题解决 /***返回键处理 */@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if( even ...

  7. React Native - Keyboard API使用详解(监听处理键盘事件)

    参考: React Native - Keyboard API使用详解(监听处理键盘事件) 当我们点击输入框时,手机的软键盘会自动弹出,以便用户进行输入. 但有时我们想在键盘弹出时对页面布局做个调整, ...

  8. Android App监听软键盘按键的三种方式(转)

    最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的&quo ...

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

    前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"GO"按键加载url页面:在点击搜索框的时候,点 ...

最新文章

  1. 【算法导论】【ACM】归并排序总结
  2. 介绍下计算机的一些常识?
  3. Golang内建库学习笔记(1)-sort和container
  4. zabbix之使用proxy实现分布式监控
  5. pandas fillna_6个提升效率的pandas小技巧
  6. 总结界面框架_UI_Adapter
  7. glassfish默认密码_在MySQL上使用含盐密码的GlassFish JDBC安全性
  8. Vue结合HTML5拖放API 实现目录拖拽~
  9. airpods删除别人的配对_怎么不让别人连我的airpods
  10. 授权(Authentication)
  11. MFC中,多个Button响应同一个事件
  12. 不是美工却依然想写出美丽的CSS该肿么办
  13. maven使用mvn命令创建项目异常java.lang.NoClassDefFoundError: org/apache/commons/collections/ExtendedProperties
  14. Bootstrap+Angularjs自制弹框
  15. 高性能迷你React框架anu发布
  16. [Halcon测量] 测量助手详解
  17. 英文投稿的一点经验【转载】
  18. 北京市公布533家接种点名单 (zz)
  19. 程序员该如何提高睡眠质量?—程序媛233酱的助攻~
  20. 为什么会用到浅拷贝和深拷贝

热门文章

  1. 滴滴橙心优选大收缩:研发员工已裁掉一半,最晚11月关全国业务
  2. css引入报错,vue项目通过import引入外部css报错怎么办
  3. c++ 图片HWC格式转CHW格式
  4. OpenCV笔记11——cvRound()、cvFloor()、 cvCeil()函数讲解
  5. NSSCTF prize_p5
  6. 转 使用迅雷下载百度云盘大文件方法
  7. Vue父组件方法和子组件方法执行优先顺序
  8. node 爬虫处理cookie,代理
  9. ubuntu下nginx安装及域名设置
  10. Qt 字体族 font-family 一览表大全