Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何防止软键盘出现在我的活动中?_Android_Soft Keyboard - Fatal编程技术网

Android 如何防止软键盘出现在我的活动中?

Android 如何防止软键盘出现在我的活动中?,android,soft-keyboard,Android,Soft Keyboard,我正在写一个Android游戏,它以全屏横向模式运行,在窗口的左下角和右下角都有按钮。问题是其中一个按钮(在许多手机上)就在菜单按钮旁边,因此播放器可能会意外地按下菜单 如果短按,我只需暂停游戏并显示游戏内菜单。没问题 但如果按下按钮的时间更长,Android会打开屏幕下半部分的软键盘。由于它会妨碍,并且在这个活动中完全没有用处,我想禁用它 我尝试了以下方法 通过InputMethodManager 发件人: 因为我只有一个视图(aGLSurfaceView),所以我在我的活动中尝试了这个视图。

我正在写一个Android游戏,它以全屏横向模式运行,在窗口的左下角和右下角都有按钮。问题是其中一个按钮(在许多手机上)就在菜单按钮旁边,因此播放器可能会意外地按下菜单

如果短按,我只需暂停游戏并显示游戏内菜单。没问题

但如果按下按钮的时间更长,Android会打开屏幕下半部分的软键盘。由于它会妨碍,并且在这个活动中完全没有用处,我想禁用它

我尝试了以下方法

通过InputMethodManager 发件人:

因为我只有一个视图(a
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);
}