美文网首页
android 获取键盘高度和键盘是否弹出

android 获取键盘高度和键盘是否弹出

作者: 念念不忘_2016 | 来源:发表于2018-03-07 18:22 被阅读0次

转自 https://www.jianshu.com/p/4c7703361835

原理

软键盘弹出时,布局会进行调整,这时只要我们监听到跟布局的高度和可是区域的高度后,他们的差值就是软件盘的高度。要获取我们需要的条件要依靠这两位哥们ViewTreeObserver.OnGlobalLayoutListener和getWindowVisibleDisplayFrame(rect)

  • OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。我们通过OnGlobalLayoutListener监听布局变化通知,这样我们就可以间接的监听到软键盘的动态。

  • getWindowVisibleDisplayFrame(rect)可以获取到程序显示的区域,包括标题栏,但不包括状态栏,获取后的区域坐标会保存在rect(Rect类型)中。

  • 软键盘的高度
    height=rootView.getRootView().getHeight()-rect.bottom;
    rootView是xml的根布局

  • Activity的android:windowSoftInputMode="adjustNothing",这种模式会失效,其他模式都可,推荐使用adjustResize。

福利区

private static boolean isFirst = true;

public interface OnGetSoftHeightListener {
    void onShowed(int height);
}
public interface OnSoftKeyWordShowListener {
    void hasShow(boolean isShow);
}

/** * 获取软键盘的高度 * *
 @param rootView *
 @param listener
 */
public static void getSoftKeyboardHeight(final View rootView, final OnGetSoftHeightListener listener) {
    final ViewTreeObserver.OnGlobalLayoutListener layoutListener
            = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (isFirst) {
                final Rect rect = new Rect();
                rootView.getWindowVisibleDisplayFrame(rect);
                final int screenHeight = rootView.getRootView().getHeight();
                final int heightDifference = screenHeight - rect.bottom;
//设置一个阀值来判断软键盘是否弹出
                boolean visible = heightDifference > screenHeight / 3;
                if (visible) {
                    isFirst = false;
                    if (listener != null) {
                        listener.onShowed(heightDifference);
                    }
                    rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            }
        }
    };
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
}



/** * 判断软键盘是否弹出
 * * @param rootView
 * @param listener
 *备注:在不用的时候记得移除OnGlobalLayoutListener
 */
public ViewTreeObserver.OnGlobalLayoutListener doMonitorSoftKeyWord(final View rootView, final OnSoftKeyWordShowListener listener) {
    final ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            final Rect rect = new Rect();
            rootView.getWindowVisibleDisplayFrame(rect);
            final int screenHeight = rootView.getRootView().getHeight();
            LogUtil.e("TAG",rect.bottom+"#"+screenHeight);
            final int heightDifference = screenHeight - rect.bottom;
            boolean visible = heightDifference > screenHeight / 3;
            if (listener != null)
                listener.hasShow(visible);
        }
    };
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
    return layoutListener;
}

@Override
protected void onDestroy() {
    super.onDestroy();
//这里对监听器进行移除
    if (softkeyListener != null){
     findViewById(R.id.rl_main).getViewTreeObserver().removeOnGlobalLayoutListener(softkeyListener);
    }
}

相关文章

  • android 获取键盘高度和键盘是否弹出

    转自 https://www.jianshu.com/p/4c7703361835 原理 软键盘弹出时,布局会进行...

  • Android关于键盘相关知识

    弹出键盘和收起键盘 弹出键盘 关闭键盘 监听键盘的回车键 监听键盘弹出和收起以及键盘高度 最近开发总结(关于键盘监...

  • iOS获取键盘高度

    iOS获取键盘高度 (1)注册监听,监听键盘的弹出 [[NSNotificationCenter defaultC...

  • Android 如何获取keyboard的高度

    Android程序中,键盘弹出或者关闭,有的时候我们需要做一些操作,那么我们怎么才能获取键盘高度呢?目前没找到直接...

  • android 获取虚拟键盘高度

    判断是否有虚拟键盘 获取虚拟键盘高度 有虚拟键盘的手机,获取到的手机屏幕的高度包括了虚拟键盘的高度,在进行一些计算...

  • iOS添加键盘弹出监听事件

    当键盘弹出时,页面控件需要重新布局,需要获取键盘的高度,添加键盘监听事件 1.在viewDidLoad中添加键盘监...

  • javascript获取手机键盘的高度

    我们知道在原生中获取键盘的高度是一件很简单的事情,在iOS键盘弹出的时候系统会发出一个键盘弹出通知.我们获取这个通...

  • 键盘遮挡完美解决方案

    如何获取当前输入控件?如何获取键盘的高度和弹出键盘的动画时间?如何计算需要 view 需要往上移动的偏移量?多个输...

  • UITextField文本输入适配键盘

    问题:当UITextField输入会弹出键盘,可以通过通知来监听键盘的显示或者隐藏获取到键盘的高度。当切换键盘的输...

  • Android中监听软键盘是否弹出和获取软键盘高度

    原理 软键盘弹出时,布局会进行调整,这时只要我们监听到跟布局的高度和可是区域的高度后,他们的差值就是软件盘的高度。...

网友评论

      本文标题:android 获取键盘高度和键盘是否弹出

      本文链接:https://www.haomeiwen.com/subject/xmksfftx.html