1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 安卓监听输入法键盘打开关闭(兼容虚拟按键栏的手机 比如华为)

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

时间:2022-03-10 16:47:35

相关推荐

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

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

原理:

在输入法打开和关闭的时候会引起当前界面的高度变化,从而出发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 /12/27.* desc:* github:/zxyaust CSDN:/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();}});

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。