gpt4 book ai didi

android - 使用 native Activity 时关闭软键盘时崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:38:11 25 4
gpt4 key购买 nike

我们正在为 Android 开发一款独立游戏,希望用户选择自己的昵称。我们选择使用 NDK 提供的 Native Activity,因为这似乎是最简单的方法。

我们在键盘上遇到的第一个问题是函数 ANativeActivity_showSoftInput() 似乎什么都不做(如描述的那样 here ),所以我们使用 JNI 函数调用调出键盘:

static void showKeyboard(Activity activity) {
String s = Context.INPUT_METHOD_SERVICE;
InputMethodManager m = (InputMethodManager)activity.getSystemService(s);
View w = activity.getWindow().getDecorView();
m.showSoftInput(w, 0);
}

这可以很好地调出键盘,并且在某些设备上也可以正常工作。但是在其他设备上(例如 Nexus 7),当用户试图通过点击“隐藏键盘”按钮来关闭键盘时,应用程序会卡住并显示以下调试输出:

I/InputDispatcher(  453): Application is not responding: AppWindowToken{429b54a8 token=Token{42661288 ActivityRecord{41bb0b00 u0 com.example.project/android.app.NativeActivity}}} - Window{420d6138 u0 com.example.project/android.app.NativeActivity}.  It has been 5006.7ms since event, 5005.6ms since wait started.  Reason: Waiting because the focused window has not finished processing the input events that were previously delivered to it.
I/WindowManager( 453): Input event dispatching timed out sending to com.example.project/android.app.NativeActivity

然后用户会看到一个对话框,上面写着:

Project isn't responding. Do you want to close it? [Wait]/[OK]

有没有我们做的明显错误的事情?或者这可能是一个错误? this one 等问题似乎表明键盘功能从未在 native 胶水中正确实现。

附带说明一下,我们还没有在许多设备上进行测试,但它不会崩溃的设备是使用较旧的 Android 操作系统的设备。此外,在它确实崩溃的地方,当键盘出现时,它会将 后退 按钮从看起来像这样的按钮更改为 backward arrow shaped button一个看起来像这样的 V shaped button .也许这对应于他们首次开发 native 胶水时未考虑的不同输入事件?我只是猜测。

无论如何,如果有人在使用 native Activity 时让软键盘工作,请告诉我们您是如何做到的。

干杯

更新

它已被报告为 Android 中的错误 here ,我们仍然很乐意听到解决方法。如果您也受到它的影响,您可能想对该问题进行投票(按星号)。

最佳答案

Peter 的解决方案效果很好。但是,如果您不想修改 native_app_glue 文件:请注意 process_input 被指定为函数指针。在您的实现文件中,按照 Peter 的描述创建您自己的 process_input 函数:

static void process_input( struct android_app* app, struct android_poll_source* source) {
AInputEvent* event = NULL;
if (AInputQueue_getEvent(app->inputQueue, &event) >= 0) {
int type = AInputEvent_getType(event);
LOGV("New input event: type=%d\n", AInputEvent_getType(event));

bool skip_predispatch
= AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY
&& AKeyEvent_getKeyCode(event) == AKEYCODE_BACK;

// skip predispatch (all it does is send to the IME)
if (!skip_predispatch && AInputQueue_preDispatchEvent(app->inputQueue, event)) {
return;
}

int32_t handled = 0;
if (app->onInputEvent != NULL) handled = app->onInputEvent(app, event);
AInputQueue_finishEvent(app->inputQueue, event, handled);
} else {
LOGE("Failure reading next input event: %s\n", strerror(errno));
}
}

android_main 函数的开头,将您的 process_input 版本分配给 android_app->inputPollSource.process

在您的事件处理程序中,确保您检查返回键 (AKEYCODE_BACK) 并拦截它以隐藏您的键盘(如果可见)。

请注意,此问题似乎存在于 Android 4.1 和 4.2 - 已在 4.3 中解决

关于android - 使用 native Activity 时关闭软键盘时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15913080/

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