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);
}
これは、キーボードを起動するのにうまく機能し、一部のデバイスではすべて一緒にうまく機能します。ただし、他のデバイス (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]
私たちが明らかに間違っていることはありますか?それともこれはバグでしょうか?このような問題は、キーボード機能がネイティブ グルーに適切に実装されていないことを示しているようです。
余談ですが、まだ多くのデバイスでテストしていませんが、クラッシュしないのは古い Android OS のデバイスです。また、クラッシュするものでは、キーボードが表示されると、戻るボタンがこのようなものからこのようなものに
変わります
。おそらくそれは、最初にネイティブ グルーを開発したときには考慮されていなかった別の入力イベントに対応しているのでしょうか? 私はちょうど推測しています。
いずれにせよ、ネイティブ アクティビティを使用しているときにソフト キーボードが動作するようになった場合は、その方法をお知らせください。
乾杯
アップデート
Android のバグとしてここで報告されていますが、回避策についてお知らせいただければ幸いです。あなたもその影響を受けている場合は、その問題に投票することをお勧めします (星印を押してください)。