在android中是否有任何方法可以获得设备虚拟键盘的高度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在android中是否有任何方法可以获得设备虚拟键盘的高度相关的知识,希望对你有一定的参考价值。

android中是否有任何方法可以在运行时获取Android设备的虚拟键盘的高度。其实我想在键盘上方显示文本框。

答案

是的,您可以在Viewtree Observer和全局布局侦听器的帮助下,尝试下面提到的步骤

  1. 获取布局的根视图
  2. 获取此根的Viewtree观察者,并在此基础上添加全局布局侦听器。

现在,无论何时显示软键盘,android都会重新调整屏幕大小,您将收到听众的电话。这就是你现在唯一需要做的就是计算你的根视图在重新调整大小和原始大小之后的高度之间的差异。如果差异超过150则认为这是因为键盘已经膨胀。

下面是一个示例代码

root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
     public void onGlobalLayout(){
           int heightDiff = root.getRootView().getHeight()- root.getHeight();
           // IF height diff is more then 150, consider keyboard as visible.  
        }
  });

此致,Techfist

另一答案

为了解决这个问题,我编写了一个键盘高度提供器,可以计算浮动软键盘的高度。可以将Activity设置为在AndroidManifest.xml中调整None或adjustPan。

https://github.com/siebeprojects/samples-keyboardheight

希比

另一答案

我为此尝试了许多建议的方法,但似乎没有一个适用于Android SDL。我认为这是因为SDL显示是“全屏”或者它位于“AbsoluteLayout”内,因此“视图”的高度从未实际改变。这个方法对我有用:

Getting the dimensions of the soft keyboard

mRootWindow = getWindow();
mRootView = mRootWindow.getDecorView().findViewById(android.R.id.content);
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
    public void onGlobalLayout(){
        Rect r = new Rect();
        View view = mRootWindow.getDecorView();
        view.getWindowVisibleDisplayFrame(r);
        // r.left, r.top, r.right, r.bottom
    }
    });
另一答案

将文本框作为父级底部。

android:layout_alignParentBottom="true"

并在清单文件中进行软输入adjustresize

android:windowSoftInputMode="adjustResize"

然后当键盘出现时,文本框将向上移动。

另一答案

你不能说。不,真的:你根本说不出来。

键盘不需要是任何特定的形状。它不必放在屏幕的底部(many选项most popularare not),它不必在更改文本字段时保持其当前大小(几乎没有依赖于标志)。它甚至不必是rectangular。它也可能只是接管entire screen

(关于类似问题的答案副本,Getting the dimensions of the soft keyboard

另一答案

我创建了一个库项目获取android键盘高度,即使活动不使用adjustResize输入模式。

https://github.com/Crysis21/KeyboardHeightProvider

另一答案

我的解决方案是上述所有解决方案的组合。这个解决方案也很hacky但解决了问题(至少对我来说)。

  1. 我在屏幕底部有透明背景的临时视图。
  2. 我已经在@bill建议的清单中的活动标签中添加了android:windowSoftInputMode="adjustResize"标志。
  3. 现在的主要故事是在onGlobalLayout()。我计算了临时视图的y轴和根视图的高度之间的差异 final View view = findViewById(R.id.base); view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int rootViewHeight = view.getRootView().getHeight(); View tv = findViewById(R.id.temp_view); int location[] = new int[2]; tv.getLocationOnScreen(location); int height = (int) (location[1] + tv.getMeasuredHeight()); deff = rootViewHeight - height; // deff is the height of soft keyboard } });

但无论如何要解决@ zeeshan0026问题只有一个标志在清单android:windowSoftInputMode="adjustResize"就足够了。

另一答案

别再看了!我一直在寻找这个解决方案很长一段时间。经过几天尝试在SOF上提出的所有技巧,我找到了真正有效的完美解决方案。

这个GitHub项目以最佳方式展示了它:https://github.com/siebeprojects/samples-keyboardheight

玩得开心!

另一答案

我已经用它在android中以编程方式获得键盘高度并进行了测试,请尝试一次:

myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {
                    // TODO Auto-generated method stub
                    Rect r = new Rect();
                    parent.getWindowVisibleDisplayFrame(r);

                    int screenHeight = parent.getRootView().getHeight();
                    int heightDifference = screenHeight - (r.bottom - r.top);
                    Log.d("Keyboard Size", "Size: " + heightDifference);

                    //boolean visible = heightDiff > screenHeight / 3;
                }
            });

谢谢。

以上是关于在android中是否有任何方法可以获得设备虚拟键盘的高度的主要内容,如果未能解决你的问题,请参考以下文章

在android模拟器中禁用menubutton

在android中查找设备的相对方向

仅使用陀螺仪和加速度计的正确方法可以在 ANDROID 上的任何轴上获得可靠的当前角度

如何在 Android 设备中获取文件 *.apk 位置

是否有任何颤振插件可以控制在 Android 和 iOS 上工作的设备的媒体音量?

如何在android设备上读取cpu频率[关闭]