java - 如何在用户释放按键后隐藏默认的 Android 软键盘
问题描述
我正在构建一个简单的 Hangman 应用程序。我目前已将键盘设置为在用户触摸提交按钮后隐藏并将 EditText 限制为“1”的 maxLength。
我想要的是键盘在用户触摸字母键并成功输入有效条目到 EditText 后立即隐藏。我已尝试实现此处使用的 KeyEvent 方法,并对其进行了修改以使用 getMaxKeyCode() 方法侦听任何关键代码。
更新***:澄清一下,我对 ENTER 按钮没有问题,它工作正常。我希望在用户触摸他们猜测的任何字母后隐藏键盘。因此,如果用户点击“E”键,只要“E”字符出现在 EditText 字段中,键盘就会隐藏。
这是我在当前迭代中使用的一些代码:
@OnClick(R.id.guess_button)
void submit() {
submitLetter();
}
private void submitLetter() {
Editable userInput = mGuessInput.getText();
String guessStr = mUserInput.toString();
if (mGuessStr.length() != 0) {
checkGuess(
String.valueOf(mGuessStr).charAt(0),
mCodeWord.toUpperCase()
);
mUserInput.clear();
mGuessInput.clearFocus();
hideKeyboard(MainActivity.this);
}
}
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view == null) {
view = new View(activity);
}
if (imm != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
这就是我要开始工作的内容:
public void hideKeyboardOnKeyTouch(EditText editText) {
final int generatedKeyCode = KeyEvent.getMaxKeyCode();
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (event.getAction() == generatedKeyCode) {
hideKeyboard(MainActivity.this);
}
return false;
}
});
}
然后我在 onCreate() 中调用 mGuessInput(EditText 视图)上的上述方法。我也试过用这种方法检查 ACTION_UP 事件,但仍然没有。
我可能缺少一个简单的解决方案,但我认为我没有只见树木不见森林。我希望这不是重复的,但我终其一生都无法找到如何让它发挥作用的解决方案。请帮忙?
解决方案
这是你可以尝试做的。在 EditText 上设置一个onKeyListener
以查看按下了什么键,如下所示:
editText.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (editText.getText().toString().length() == 1) {
hideKeyboard(MainActivity.this, <Your view here>);
}
return true;
}
});
尝试将您的hideKeyboard
功能更改为以下内容:
public static void hideKeyboardFrom(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
推荐阅读
- aws-lambda - 如何在 aws 中管理多个不同的 lambda?
- python - 手写输入python
- vue.js - (vue.js)点击图片时,我想为每张图片调用一个模态
- azure - 如何使用 azure devOps 在 azure app 服务上部署 nupkg 文件
- angular - 是否有任何替代方法可以在角度的所有元素上编写点击功能
- java - Picasso“目标不能为空”(使用 Firebase 数据库)
- python - 如何从多个模块 python 日志记录
- regex - Perl 正则表达式仅匹配 Diggernaut 中的第一次出现
- r - 线性回归模拟
- security - 使用 JWT 保护 SPA 的最佳实践