获得软键盘的尺寸

时间:2012-11-23 18:45:19

标签: android keyboard cocos2d-x

有没有办法知道屏幕上显示的键盘大小?

我正在使用Cocos2dx进行编程,但我想知道Android部分或Cocos部分屏幕中显示的键盘高度,这没关系。

我知道Keyboard有一个getHeight()方法,但我不想创建新的键盘,我想使用默认键盘。

12 个答案:

答案 0 :(得分:34)

我们用这个

做到了
myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {

                    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);

                }
            });

我们只使用键盘调整视图大小,因此我们可以使用它。

答案 1 :(得分:20)

Rect r = new Rect();
View rootview = this.getWindow().getDecorView(); // this = activity
rootview.getWindowVisibleDisplayFrame(r);

这是您的应用程序在屏幕上使用的空间量(即使活动调整大小时也能正常工作)。显然,键盘将使用剩余的屏幕空间(如果可见)

在此处找到了ID:https://github.com/freshplanet/ANE-KeyboardSize/blob/master/android/src/com/freshplanet/ane/KeyboardSize/getKeyboardY.java

答案 2 :(得分:9)

如果您的活动不是全屏,请使用以下代码:

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

                @Override
                public void onGlobalLayout() {
                    // TODO Auto-generated method stub
                    if (keyBoardHeight <= 100) {
                        Rect r = new Rect();
                        content.getWindowVisibleDisplayFrame(r);

                        int screenHeight = content.getRootView()
                                .getHeight();
                        int heightDifference = screenHeight
                                - (r.bottom - r.top);
                        int resourceId = getResources()
                                .getIdentifier("status_bar_height",
                                        "dimen", "android");
                        if (resourceId > 0) {
                            heightDifference -= getResources()
                                    .getDimensionPixelSize(resourceId);
                        }
                        if (heightDifference > 100) {
                            keyBoardHeight = heightDifference;
                        }

                        Log.d("Keyboard Size", "Size: " + heightDifference);
                    }
                    // boolean visible = heightDiff > screenHeight / 3;
                }
            });

答案 3 :(得分:5)

如果您想在活动大小不变(adjustPan)时计算虚拟键盘高度,那么您可以使用此示例:

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

它使用隐藏窗口来计算窗口和活动的根视图之间的高度差。

答案 4 :(得分:3)

你无法分辨。不,真的:你根本说不出来。

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

答案 5 :(得分:3)

我知道这是一个旧帖子,但我注意到我选择的解决方案并不适用于所有设备。似乎存在差异,所以我实现了这一点,它似乎是一个全部:

        final int[] discrepancy = new int[1];
        discrepancy[0] = 0;

        // this gets the height of the keyboard
        content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                View rootview = activity.getWindow().getDecorView(); // this = activity
                rootview.getWindowVisibleDisplayFrame(r);

                int screen_height = rootview.getRootView().getHeight();
                int keyboard_height = screen_height - (r.bottom + r.top) - discrepancy[0];

                if (discrepancy[0] == 0) {
                    discrepancy[0] = keyboard_height;
                    if (keyboard_height == 0) discrepancy[0] = 1;
                }

                int margin_bottom = keyboard_height + Helper.getDp(10, activity);

                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) carousel_container.getLayoutParams();
                params.setMargins(0, 0, 0, margin_bottom);

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

当第一次调用监听器时,它会在没有键盘的情况下测量屏幕,如果存在差异,我会在下次使用它时对其进行说明。如果没有差异,我将差异设置为1,使其不再为0.

答案 6 :(得分:2)

在cocos2d-x中我们有CCEditBox。

内部扩展 - &gt; GUI-&gt; CCEditBox,您可以找到类CCEditBox。

美丽的是它隐藏了在现场其他地方敲击的键盘。并且当你的编辑框在场景中放得太低时自动移动键盘。

如果您使用的是cocos2d-x v2.1.3,那么您可以转到

导航到示例项目

标本:&GT; CPP-&GT; TestCpp-&GT;类 - &GT; ExtensionTest-&GT; EditBoxTest

从现在开始,我将使用它而不是CCTextField。昨天才发现它:)

答案 7 :(得分:1)

经过数小时的搜索后,我找到了一个解决方案,如果你想设置windowSoftInput="adjustPan"

以下是代码段:

    final View root  = findViewById(android.R.id.content);
    root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    Rect r = new Rect();
    {
        root.getWindowVisibleDisplayFrame(r);
    }
    @Override
    public void onGlobalLayout() {
        Rect r2 = new Rect();
        root.getWindowVisibleDisplayFrame(r2);
        int keyboardHeight = r.height() - r2.height();
        if (keyboardHeight > 100) {
            root.scrollTo(0, keyboardHeight);
        }
        else {
            root.scrollTo(0, 0);
        }
    }
});

在这段代码中,找到键盘高度后,我将视图向上滚动到键盘未覆盖的位置,这是找到键盘高度的主要原因。

根据docs

void getWindowVisibleDisplayFrame(Rect outRect)检索此视图附加到的窗口的整体可见显示大小。

答案 8 :(得分:0)

可以将Android显示屏的ROOT_VIEW可视化为带有VISIBLE DISPLAY FRAME的单个屏幕视图,该视图显示您的活动视图。

当在屏幕上显示或隐藏软键盘时,会调整此可见显示帧。

注意:请点击下面给出的链接查看这两个图片,以便更好地理解

因此,显示屏的ROOT VIEW可视化为: RootView of display screen

随着软键盘的打开和关闭,可视显示框架的调整可视化为: VISIBLE_DISPLAY_SCREEN adjustment

这种VISUAL DISPLAY FRAME的调整可以很好地用于找出键盘的高度:

(当软键盘打开时)

SOFT_KEYBOARD_HEIGHT = ROOT_VIEW_HEIGHT - (VISUAL_DISPLAY_FRAME_HEIGHT + EXTRA_SCREEN_HEIGHT)

实现上述目标的代码是:

int mExtraScreenHeight=-1, mKeyboardHeight=-1;
boolean mKeyboardOpen;



    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            int rootViewHeight, visibleDisplayFrameHeight, fakeHeight;

            /* (rootViewHeight - visibleDisplayFrameHeight) is not the real height of the keyboard
                it is the fake height as it also consist of extra screen height
                so FAKE_HEIGHT = KEYBOARD_HEIGHT + EXTRA_SCREEN_HEIGHT

                To get keyboard height extra screen height must be removed from fake height
             */

            Rect rect = new Rect();
            rootView.getWindowVisibleDisplayFrame(rect);

            rootViewHeight = rootView.getRootView().getHeight();
            visibleDisplayFrameHeight = rect.height();

            fakeHeight = rootViewHeight-visibleDisplayFrameHeight;

            if (mExtraScreenHeight == -1){
                mExtraScreenHeight=fakeHeight;
            }
            /* Suppose the soft keyboard is open then the VISIBLE_DISPLAY_FRAME is in reduced size
                due to the space taken up by extra screen and the keyboard but when the soft keyboard closes
                then KEYBOARD_HEIGHT=0 and thus FAKE_HEIGHT = EXTRA_SCREEN_HEIGHT
             */
            else if (fakeHeight <= mExtraScreenHeight){
                mExtraScreenHeight=fakeHeight;
                mKeypadOpen=false;
            }
            else if (fakeHeight > mExtraScreenHeight){
                mKeypadHeight=fakeHeight-mExtraScreenHeight;
                mKeypadOpen=true;
            }
        }
    });

注意:仅当全局布局发生变化(如软键盘打开时)时,才会调用onGlobalLayout()函数。因此,软键盘必须至少打开一次才能获得软键盘高度。

它对我有用;)

答案 9 :(得分:0)

很抱歉无法发表评论,其中有两三个答案帮助我解决了我的问题,他们与使用AddOnGlobalLayoutListener相关,然后确定键盘出现前后的剩余高度。

我使用的解决方案是基于Rudy_TM的答案。

然而,我必须找到的一件事是,为了使该方法有效,你必须在某处有以下行

Window.SetSoftInputMode(SoftInput.AdjustResize);

在我使用SoftInput.AdjustNothing(或类似的东西)之前,它不起作用。现在它完美无缺。谢谢你的答案!

答案 10 :(得分:0)

完整的答案并为我完美地工作:

  Rect r = new Rect();
  View rootview = this.getWindow().getDecorView(); // this = activity
  rootview.getWindowVisibleDisplayFrame(r);
  int keyboardHeight = rootview.getHeight() - r.bottom;

答案 11 :(得分:0)

2020 年后,如果您的最小 SDK 大于或等于 21,您可以通过以下功能检查 IME 的可见性和高度:

fun isKeyboardVisible(attachedView: View): Boolean {
    val insets = ViewCompat.getRootWindowInsets(attachedView)
    return insets?.isVisible(WindowInsetsCompat.Type.ime()) ?: false
}

fun getKeyboardHeight(attachedView: View): Int {
    val insets = ViewCompat.getRootWindowInsets(attachedView)
    return insets?.getInsets(WindowInsetsCompat.Type.ime())?.bottom ?: 0
}

参考:Animating your keyboard (part 1). New WindowInsets APIs for checking the… | by Chris Banes | Android Developers | Medium