我们正在开发针对android的独立游戏,并希望用户选择他的昵称。我们选择使用NDK提供的本地活动,因为这似乎是最简单的方法。在使用本地活动时关闭软键盘时发生崩溃
我们用键盘遇到的第一个问题是,该功能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这样的问题似乎表明键盘功能从未在本地胶水中正确实施。
在附注中,我们还没有在很多设备上进行过测试,但没有崩溃的是使用较旧的android操作系统的测试。另外,在出现崩溃的那些键盘出现时,它会将背面的按钮从看起来像的按钮更改为看起来像这样的一个按钮 。也许这对应于不同的输入事件,当他们第一次开发本地粘合剂时没有考虑到这一点?我只是猜测。
无论如何,如果有人在使用本地活动时使用软键盘工作,请告诉我们您是如何做到的。
干杯
UPDATE
据报道,在Android的here的错误,我们仍然很乐意听到的解决方法,但。如果你也受到它的影响,你可能想在这个问题上投票(按星号)。
我完全错过了,比修补c文件好多了,谢谢。 – 2013-07-30 21:15:51
偶然地,我今天收到了Nexus的升级版本,看起来问题已在Android 4.3中得到修复。只有在Android版本为4.2时,您的建议才能轻松应用修补后的process_input功能。如果你愿意,你可以结合你和我的答案为其他人提供最终的解决方案。然后我会将其标记为最终答案。否则,如果我记得,我会在下周的某个时候尝试。干杯。 – 2013-07-30 22:57:49
当然 - 更新。我也注意到这个问题已经在4.3中解决了!太糟糕了,它会在4.1和4.2手机市场上持续一段时间... – krsteeve 2013-07-31 01:10:33