gpt4 book ai didi

android - 在 Android NativeActivity 中管理键盘输入的最佳方式是什么?

转载 作者:行者123 更新时间:2023-11-30 02:52:18 35 4
gpt4 key购买 nike

我在我的应用程序中使用键盘时遇到问题,该应用程序是一个纯 native 应用程序(基于 Android NDK 中提供的native-activity 示例)。

我有这段 Java 代码来显示键盘:

mApplicationActivity.runOnUiThread(new Runnable(){
@Override
public void run() {

if(mTextEdit != null)
mTextEdit.setVisibility(View.GONE);
mTextEdit = new EditText(mApplicationActivity);

InputMethodManager m = (InputMethodManager) mApplicationActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
mTextEdit.setText(mTextEditValue);
mEditTextLayoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
mEditTextLayoutParams.gravity = Gravity.TOP;
mEditTextLayoutParams.setMargins(left, top, right, bottom);
mTextEdit.setLayoutParams(mEditTextLayoutParams);
mTextEdit.setVisibility(View.VISIBLE);
mTextEdit.addTextChangedListener(mTextWatcher);

mApplicationActivity.addContentView(mTextEdit, mEditTextLayoutParams);

mTextEdit.bringToFront();
mTextEdit.setSelection(mTextEdit.getText().length());
mTextEdit.requestFocus();

m.showSoftInput(mTextEdit, InputMethodManager.SHOW_FORCED);
}
});

我使用 textWatcher 检测输入更改以通知我的 C++ 代码并更新 OpenGL UI。它似乎在我的 Nexus 4 和 Android 4.4.2 中正常工作,但今天我有一个 Nexus 4 和 Android 4.2.2,我无法删除我写的文本。

所以我想知道处理键盘输入的最佳方式是什么,假设:

  • 我使用 OpenGL 渲染我自己的 UI,EditText 在屏幕外。
  • 使用按键事件是个坏主意(如此处解释:https://code.google.com/p/android/issues/detail?id=42904“它不能正确处理手势输入、语音输入、切换输入或开发人员可能想出的任何新发明的输入法 future 。”)

我也会考虑是否可以将 Java EditText 放在我的 OpenGL 上,但我不知道该怎么做。

这是 textWatcher 代码:

TextWatcher mTextWatcher = new TextWatcher() {  
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Call to C++ code
SendChangedText(s.toString());
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void afterTextChanged(Editable s) {

}
};

最佳答案

我还在我的项目中使用 NativeActivity。关键事件方法 -

public boolean dispatchKeyEvent(KeyEvent event) { ... }

只在一开始为我工作,直到有一天,在 4.4 下,存在退格键(删除)键事件根本没有发送到事件处理程序的错误。看起来它是基本 android 键盘的已知错误。所以我从原始按键处理转向“隐藏的 EditText”解决方案。

隐藏的 EditText 为您提供了消除错误和处理预测输入的方法。为此,您需要实现自己的 InputConnectionWrapper(或者也可以是 BaseInputConnection)。在 EditText 内部覆盖 onCreateInputConnection:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

// We set manual input connection to catch all keyboard interaction
return new MyInputConnection(super.onCreateInputConnection(outAttrs), true);

}

@Override
public boolean onCheckIsTextEditor() {
return true;
}

现在我们可以在里面捕获很多输入事件了:

class MyInputConnection extends InputConnectionWrapper {

public MyInputConnection(InputConnection target, boolean mutable) {
super(target, mutable);
}

@Override
public boolean setComposingText(CharSequence text, int newCursorPosition)
{
Log.d(TAG, "setComposingText " + text);
return super.setComposingText(text, newCursorPosition);
}

@Override
public boolean commitText(CharSequence text, int newCursorPosition)
{
Log.d(TAG, "commitText " + text);
return super.commitText(text, newCursorPosition);
}

@Override
public boolean sendKeyEvent(KeyEvent event) {
return super.sendKeyEvent(event);
}


@Override
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
if (beforeLength == 1 && afterLength == 0) {
Log.d(TAG, "DELETE!");
}

return super.deleteSurroundingText(beforeLength, afterLength);
}

}

有关详细信息,请参阅 InputConnectionWrapper 类。据我了解,从软件键盘捕获所有事件的唯一方法是覆盖此接口(interface)提供的所有方法。

关于android - 在 Android NativeActivity 中管理键盘输入的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937968/

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