安卓监听输入法键盘打开关闭(兼容虚拟按键栏的手机,比如华为)
2016-12-28 14:39
831 查看
可以监听输入法键盘的打开和关闭动作,通过回调精准判断,兼容几乎所有手机
原理:
在输入法打开和关闭的时候会引起当前界面的高度变化,从而出发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);//去除底部虚拟栏之后的metric int 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() { @Override public void run() { observe(view); } }, 500); } private void observe(View view) { view.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { //当键盘弹出隐藏的时候会 调用此方法。 @Override public 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() { @Override public void onOpen() { startAniout(); } @Override public void onClose() { startAniIn(); } });
相关文章推荐
- 安卓监听键盘的打开和关闭
- 史上最全:安卓监听软键盘打开或者关闭
- Android 监听手机键盘打开和关闭状态
- Android 监听键盘的关闭和打开
- 安卓输入法界面的关闭/打开
- [置顶] 监听软键盘打开或关闭触发动作
- Android 打开关闭键盘以及监听的工具类
- 安卓手机关闭底部键盘灯的方法(htc G11亲测有效)
- Android监听键盘打开或关闭
- 安卓-关闭或打开输入法
- 移动端监听手机键盘弹起和关闭(Ionic+Cordova)
- 安卓开发小问题:关闭/打开输入法弹窗
- 安卓手机关闭底部键盘灯的方法(htc G11亲测有效)
- 打开和关闭输入法
- 打开和关闭输入法软键盘 .
- android 输入法的关闭和打开
- [转]兼容IE和Firefox的打开新窗口,关闭父窗口,不提示解决方法
- Android程序打开和关闭输入法,this.getCurrentFocus()有时为空,加try catch
- 解决: ctrl+shift 快速切换输入法导致自动关闭当前打开的任何窗口的问题
- iPhone开发【二十八】监听键盘状态、输入法状态