获取软键盘的尺寸

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

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

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

我们这样做了

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

我们只是用键盘调整视图的大小,所以我们可以使用这个。

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

结果是您的应用程序在屏幕上使用的空间量(即使活动resize时也可以使用)。 显然剩余的屏幕空间将被键盘使用(如果它可见)

在这里findid: https : //github.com/freshplanet/ANE-KeyboardSize/blob/master/android/src/com/freshplanet/ane/KeyboardSize/getKeyboardY.java

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

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

你不能告诉。 不,真的:你根本看不出来。

键盘不需要是任何特定的形状。 它不一定要放在屏幕的底部( 很多 最stream行的选项都不是 ),当你改变文本字段时,它不必保持当前的大小(几乎没有任何一个取决于标志)。 它甚至不必是矩形的 。 它也可能只是接pipe整个屏幕 。

如果你想计算虚拟键盘的高度,而你的活动没有改变大小(adjustPan),那么你可以使用这个示例:

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

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

我知道这是一个旧的post,但我注意到,我select的解决scheme并不适用于所有设备。 似乎有差异,所以我实现了这一点,似乎是一个难题:

  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。

在cocos2d-x中我们得到了CCEditBox。

内部扩展 – > GUI-> CCEditBox,你可以find类CCEditBox。

它的美妙之处在于它隐藏了在现场其他地方敲击的键盘。 并在您的编辑框放置在场景太低时自动移动键盘。

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

标本:> CPP-> TestCpp->类 – > ExtensionTest-> EditBoxTest。

我从现在开始只使用它而不是CCTextField。 刚刚碰到它昨天:)

Android显示屏幕的ROOT_VIEW可以被视为一个单一的屏幕视图,显示你的活动视图的可视化显示框架。

当软键盘显示或隐藏在屏幕上时,此可视显示框将被调整。

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

因此,显示屏幕的根视图可以被显示为:显示屏幕的根视图

可视显示框的调整可以通过打开和closuresSOFT KEYBOARD来显示: VISIBLE_DISPLAY_SCREEN调整

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()函数。 所以软键盘必须打开至less一次以获得软键盘的高度。

它为我工作;)

对不起,不能评论,两个或三个答案帮助我解决了我的问题,他们有关使用AddOnGlobalLayoutListener,然后确定键盘出现之前和之后的剩余高度。

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

然而,我必须find的一件事是,为了使这种方法起作用,你必须在下面一行

 Window.SetSoftInputMode(SoftInput.AdjustResize); 

在我有SoftInput.AdjustNothing(或类似的东西)之前,它不会工作。 现在它工作完美。 感谢您的答案!

经过几个小时的search,我发现一个解决scheme, 如果你想设置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); } } }); 

在这段代码中,我发现键盘的高度后,将视图向上滚动到不被键盘覆盖,这是查找键盘高度的主要原因。

根据文件 :

void getWindowVisibleDisplayFrame(Rect outRect)检索此视图所附窗口的整体可见显示尺寸。