安卓监听输入法键盘打开关闭(兼容虚拟按键栏的手机,比如华为)
可以监听输入法键盘的打开和关闭动作,通过回调精准判断,兼容几乎所有手机
原理:
在输入法打开和关闭的时候会引起当前界面的高度变化,从而出发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();}});
安卓监听输入法键盘打开关闭(兼容虚拟按键栏的手机,比如华为)相关推荐
- Android监听软键盘开启关闭状态
最近公司项目有一个功能点是监听软键盘的打开关闭状态,然后来展开不同的布局,后来在StackOverFlow上面找到一位大神提供了解决办法,大致做法如下: 在你需要监听状态的界面activity或者fr ...
- android 隐藏输入法时自动关闭弹窗,Android监听输入法弹窗和关闭的实现方法
用过ios的都知道ios上输入法关闭的同时会自动关闭输入框,那么在android上如何实现监听输入法弹出和关闭呢?本篇文章就为你提供了一种可靠的实现方式. 首先在AndroidManifest中配置 ...
- android 键盘隐藏监听,安卓监听软键盘弹出与隐藏的两种方法
需求: 现在有一个需求是点击一行文本框,弹出一个之前隐藏的输入框,输入完成后按返回键或者其他的东西隐藏键盘和输入框,将输入框的内容填充到文本框中. 实现: 拿到这个需求的第一反应就是写一个监听来监听键 ...
- 安卓监听软键盘搜索键
1.EditText中添加**android:imeOptions="actionSearch" android:singleLine="true"**两行, ...
- 【Android应用】【监听软键盘弹起与关闭】
[背景] 在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹 ...
- Android App监听软键盘按键的三种方式 以及 输入法删除退格键的冲突问题解决
输入法删除退格键的冲突问题解决 /***返回键处理 */@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if( even ...
- React Native - Keyboard API使用详解(监听处理键盘事件)
参考: React Native - Keyboard API使用详解(监听处理键盘事件) 当我们点击输入框时,手机的软键盘会自动弹出,以便用户进行输入. 但有时我们想在键盘弹出时对页面布局做个调整, ...
- Android App监听软键盘按键的三种方式(转)
最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的&quo ...
- Android App监听软键盘按键的三种方式
前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"GO"按键加载url页面:在点击搜索框的时候,点 ...
最新文章
- 【算法导论】【ACM】归并排序总结
- 介绍下计算机的一些常识?
- Golang内建库学习笔记(1)-sort和container
- zabbix之使用proxy实现分布式监控
- pandas fillna_6个提升效率的pandas小技巧
- 总结界面框架_UI_Adapter
- glassfish默认密码_在MySQL上使用含盐密码的GlassFish JDBC安全性
- Vue结合HTML5拖放API 实现目录拖拽~
- airpods删除别人的配对_怎么不让别人连我的airpods
- 授权(Authentication)
- MFC中,多个Button响应同一个事件
- 不是美工却依然想写出美丽的CSS该肿么办
- maven使用mvn命令创建项目异常java.lang.NoClassDefFoundError: org/apache/commons/collections/ExtendedProperties
- Bootstrap+Angularjs自制弹框
- 高性能迷你React框架anu发布
- [Halcon测量] 测量助手详解
- 英文投稿的一点经验【转载】
- 北京市公布533家接种点名单 (zz)
- 程序员该如何提高睡眠质量?—程序媛233酱的助攻~
- 为什么会用到浅拷贝和深拷贝
热门文章
- 滴滴橙心优选大收缩:研发员工已裁掉一半,最晚11月关全国业务
- css引入报错,vue项目通过import引入外部css报错怎么办
- c++ 图片HWC格式转CHW格式
- OpenCV笔记11——cvRound()、cvFloor()、 cvCeil()函数讲解
- NSSCTF prize_p5
- 转 使用迅雷下载百度云盘大文件方法
- Vue父组件方法和子组件方法执行优先顺序
- node 爬虫处理cookie,代理
- ubuntu下nginx安装及域名设置
- Qt 字体族 font-family 一览表大全