Android 如何防止软键盘出现在我的活动中?
我正在写一个Android游戏,它以全屏横向模式运行,在窗口的左下角和右下角都有按钮。问题是其中一个按钮(在许多手机上)就在菜单按钮旁边,因此播放器可能会意外地按下菜单 如果短按,我只需暂停游戏并显示游戏内菜单。没问题 但如果按下按钮的时间更长,Android会打开屏幕下半部分的软键盘。由于它会妨碍,并且在这个活动中完全没有用处,我想禁用它 我尝试了以下方法 通过InputMethodManager 发件人: 因为我只有一个视图(aAndroid 如何防止软键盘出现在我的活动中?,android,soft-keyboard,Android,Soft Keyboard,我正在写一个Android游戏,它以全屏横向模式运行,在窗口的左下角和右下角都有按钮。问题是其中一个按钮(在许多手机上)就在菜单按钮旁边,因此播放器可能会意外地按下菜单 如果短按,我只需暂停游戏并显示游戏内菜单。没问题 但如果按下按钮的时间更长,Android会打开屏幕下半部分的软键盘。由于它会妨碍,并且在这个活动中完全没有用处,我想禁用它 我尝试了以下方法 通过InputMethodManager 发件人: 因为我只有一个视图(aGLSurfaceView),所以我在我的活动中尝试了这个视图。
GLSurfaceView
),所以我在我的活动中尝试了这个视图。onCreate()
:
它不起作用:长按菜单时仍会出现软键盘
通过AndroidManifest.xml
发件人:
我将此添加到我的清单中:
<activity
android:windowSoftInputMode="stateAlwaysHidden"
>
也没有做很多事情
所以。。。有办法吗?如何解决?至少,这里有一个解决我眼前问题的方法。无论按钮按下多长时间,它都会显示游戏中的菜单
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
event.startTracking();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
// From the docs:
// "Note that in order to receive this callback, someone in the event [chain]
// must return true from onKeyDown(int, KeyEvent) and call startTracking() on the event."
if (keyCode == KeyEvent.KEYCODE_MENU) {
// Override default handling, and don't pop up the soft keyboard.
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
openOptionsMenu();
return true;
}
return super.onKeyUp(keyCode, event);
}
但这感觉像是一个黑客,所以我希望有人能想出一个更好的解决方案。试着改用。根据文件:
请求从当前接受输入的窗口的上下文中隐藏软输入窗口
但如果按钮按下的时间更长,
安卓在手机上打开软键盘
屏幕的下半部分
你有什么电话?你确定吗?我从未见过这种情况发生,我只是尝试过,但在我的手机上不起作用
而且,这听起来像是用户的问题。不要试图颠覆用户。如果用户真的想在你的应用程序中打开键盘,你应该让他们打开,如果没有用,他们会回击,然后键盘就会消失
一个更值得关注的问题是,您的按钮离菜单按钮太近。在android清单中使用android:WindowsofInputMode=“adjustPan”。
我认为这是防止视图上升的最佳选择。开箱思考好答案,谢谢。这部手机是Nexus手机。我的按钮必须靠近屏幕的边缘,以尽可能多地保持屏幕的真实状态。“硬件”按钮只不过是触摸屏的延伸,没有有形的边界,这一事实可能被认为是手机的设计缺陷。。。但我不认为N1是唯一一款采用这种设计的手机。@Thomas:实际上,有一款软件可以防止意外按下菜单按钮。你个人有过这个问题吗?我几乎从未意外地按过菜单按钮。不是我个人,而是一个从未使用过N1的人。也许这并不像我最初想的那么大。我认为有些情况下你确实想阻止用户打开你应用程序中的键盘。显示预览帧的相机应用程序就是一个例子。DroidX默认情况下会在长按菜单时打开软键盘。我支持开箱思考,但有时你只是想让它做某件事,而你的代码可以帮助完成这一点。我不知道我是否会称之为“黑客”,可能是因为你必须经历一些困难才能让它工作。。。谢谢我同意这是一个黑客-但这是一个非常有效的黑客。非常感谢你;这正是我所需要的(其他方法也都不适合我)。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
event.startTracking();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
// From the docs:
// "Note that in order to receive this callback, someone in the event [chain]
// must return true from onKeyDown(int, KeyEvent) and call startTracking() on the event."
if (keyCode == KeyEvent.KEYCODE_MENU) {
// Override default handling, and don't pop up the soft keyboard.
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
openOptionsMenu();
return true;
}
return super.onKeyUp(keyCode, event);
}