gpt4 book ai didi

android - 如何在 View 中捕获软键盘输入?

转载 作者:IT王子 更新时间:2023-10-28 23:52:12 28 4
gpt4 key购买 nike

我有一个子类 View ,当它在 onTouchEvent 中接收到“修饰”时会弹出键盘。它通过请求焦点、检索 InputMethodManager,然后调用 showSoftInput 来显示这一点。

现在我需要弄清楚如何捕捉软键盘上敲击的字母,当它们被按下时。我目前仅在按下软键盘上的 Next/Done 按钮时得到响应。

这是我的课:

public class BigGrid extends View {

private static final String TAG = "BigGrid";

public BigGrid(Context context) {
super(context);
setFocusableInTouchMode(true); // allows the keyboard to pop up on
// touch down

setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
Log.d(TAG, "onKeyListener");
if (event.getAction() == KeyEvent.ACTION_DOWN) {
// Perform action on key press
Log.d(TAG, "ACTION_DOWN");
return true;
}
return false;
}
});
}

@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
Log.d(TAG, "onTOUCH");
if (event.getAction() == MotionEvent.ACTION_UP) {

// show the keyboard so we can enter text
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(this, InputMethodManager.SHOW_FORCED);
}
return true;
}

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
Log.d(TAG, "onCreateInputConnection");

BaseInputConnection fic = new BaseInputConnection(this, true);
outAttrs.actionLabel = null;
outAttrs.inputType = InputType.TYPE_CLASS_TEXT;
outAttrs.imeOptions = EditorInfo.IME_ACTION_NEXT;
return fic;
}

@Override
public boolean onCheckIsTextEditor() {
Log.d(TAG, "onCheckIsTextEditor");
return true;
}

@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);

canvas.drawColor(R.color.grid_bg);
// .
// .
// alot more drawing code...
// .
}
}

键盘显示,但我的 onKeyListener 仅在我按下键盘上的“下一步”按钮时触发。我需要点击哪个字符,以便在我的 onDraw() 方法中显示它。

最佳答案

实际上可以自己处理关键事件,而无需从 TextView 派生 View 。

为此,只需将您的原始代码修改如下:

1) 替换 onCreateInputConnection() 中的以下行:

outAttrs.inputType = InputType.TYPE_CLASS_TEXT;

用这个:

outAttrs.inputType = InputType.TYPE_NULL;

根据 InputType.TYPE_NULL: 的文档:“这应该解释为目标输入连接不丰富,它不能处理和显示候选文本等内容,也不能检索当前文本,所以输入法需要在有限的“生成键事件”模式下运行。”

2) 用同样的方法替换下面一行:

BaseInputConnection fic = new BaseInputConnection(this, true);

用这个:

BaseInputConnection fic = new BaseInputConnection(this, false);

错误的第二个参数将 BaseInputConnection 置于“虚拟”模式,需要这样才能将原始键事件发送到您的 View 。在 BaseInputConnection 代码中,您可以找到如下几条注释:“只有在 dummy 模式下,才会为新文本发送按键事件并清除当前可编辑缓冲区。”

我已经使用这种方法让软键盘将原始事件发送到我的从 LinearLayout 派生的 View (即不是从 TextView 派生的 View ),并且可以确认它可以工作。

当然,如果您不需要设置 IME_ACTION_DONE imeOptions 值来在键盘上显示完成按钮,那么您可以删除 onCreateInputConnection()onCheckIsTextEditor() 完全覆盖,然后默认情况下将原始事件发送到您的 View ,因为没有定义能够进行更复杂处理的输入连接。

但不幸的是,在不覆盖这些方法并提供 BaseInputConnection 对象的情况下,似乎没有一种简单的方法来配置 EditorInfo 属性,一旦完成,您将不得不按照所述简化该对象执行的处理如果您想再次接收原始键事件,请在上面。

警告:Android(Google 键盘)附带的某些最新版本的默认 LatinIME 键盘引入了两个错误,这些错误可能会在使用该键盘时影响键盘事件处理(如上所述)。我在应用程序端设计了一些解决方法,带有示例代码,似乎可以解决这些问题。要查看这些解决方法,请参阅以下答案:

Android - cannot capture backspace/delete press in soft. keyboard

关于android - 如何在 View 中捕获软键盘输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5419766/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com