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

问题描述 投票:34回答:9

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

android sdk
9个回答
29
投票

是的,您可以在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


42
投票

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

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

希比


35
投票

我为此尝试了许多建议的方法,但似乎没有一个适用于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
    }
    });

6
投票

将文本框作为父级底部。

android:layout_alignParentBottom="true"

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

android:windowSoftInputMode="adjustResize"

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


4
投票

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

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

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


3
投票

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

https://github.com/Crysis21/KeyboardHeightProvider


0
投票

我的解决方案是上述所有解决方案的组合。这个解决方案也很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"就足够了。


0
投票

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

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

玩得开心!


0
投票

我已经用它在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;
                }
            });

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.