当前位置: 首页 > 知识库问答 >
问题:

使用本机活动时关闭软键盘时崩溃

廉志强
2023-03-14

我们正在为android开发一个独立游戏,并希望用户选择他的昵称。我们选择使用NDK提供的本机活动,因为这似乎是最简单的方法。

我们遇到的键盘的第一个问题是函数ANativeActivity_showSoftInput()似乎什么都不做(如这里所述),所以我们使用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);
}

这对于调出键盘很好,在一些设备上也很好。但在其他设备上(例如Nexus7),当用户试图通过单击“隐藏键盘”按钮关闭键盘时,应用程序将以以下调试输出冻结:

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]

是不是我们做的事情明显错了?或者这可能是一个窃听器?类似这样的问题似乎表明键盘功能从未在原生Glue中正确实现过。

无论如何,如果有人在使用本机活动时得到软键盘工作,请让我们知道你是如何做到的。

更新

这已经被报道为Android的一个bug,我们仍然很乐意听到解决方法。如果你也受到它的影响,你可能会想要在这个问题上投票(通过按星号)。

共有1个答案

柯琛
2023-03-14

彼得的解决方案很管用。但是,如果您不想修改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。

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

 类似资料:
  • 我有一个在清单中带有< code > Android:windowSoftInputMode = " state visible " 的Edittext。现在,当我开始活动时,键盘会显示出来。怎么隐藏?我不能使用< code > Android:windowSoftInputMode = " state hidden ,因为当键盘可见时,最小化应用程序并恢复它,键盘应该是可见的。我试着 但它没有起

  • 我正试图在Kotlin中编写一个简单的Android应用程序。我的版面中有一个编辑文本和一个按钮。在编辑字段中写入并单击按钮后,我想隐藏虚拟键盘。 关于用Java实现Android软键盘,有一个流行的问题是关闭/隐藏Android软键盘,但据我所知,Kotlin应该有一个替代版本。我该怎么做?

  • 我有一个片段,其中包含一个ViewPager2的2个fragemnt。在第二个子片段中,我有一个回收器视图,其视图保持器包含 TextView 和 EditText。 在模拟器中,当我点击编辑视图时,软键盘一直关闭。 在真实设备(索尼xperia XA)中,软键盘没有关闭,但它总是关注第一个编辑文本,无论我是否在另一个编辑文本中单击 我曾尝试使用android:WindowsOfInputMode

  • 我有一个,其中有5个s。当用户单击第一个时,软键盘打开,在其中输入一些值。当软键盘打开时,当用户单击第一个时,以及当软键盘从按下后退按钮的相同关闭时,我想将其他一些

  • 我有一个GLSURFACHEVIEW,在那里我呈现我的GUI。在一种情况下,我需要用户输入一个数字,为了实现这一点,我使用了一个框架布局,上面是我的GLSurfaceView,后面是另一个虚拟布局,后面是EditText。当需要输入时,我聚焦编辑文本并强制软键盘显示。然后我听各种方法来结束输入,输入键,输入法动作完成,返回键等等。 然而,我刚刚意识到一个情况,这是不起作用的。在某些键盘上有一个“隐

  • 问题内容: 在应用程序启动时,我需要显示虚拟键盘,但是到目前为止,我失败了。 我在方法“ OnCreate”中使用此代码来显示虚拟键盘 该代码在任何时候都可以在任何屏幕上正常运行,但是在“第一个”活动开始时不起作用。为什么? 我在开始另一个活动时尝试了它,但是它起作用了,但是在我开始“第一个”活动时却不起作用。 我试图将这段代码放入事件“ OnCreate”以及更多事件中……。但似乎不起作用。 启