GameActivity の TextInput   Android Game Development Kit の一部。

GameActivity は次の方法で GameTextInput を統合しています。

  • ラッパーを提供する
  • 新しいテキスト入力イベントの可用性に関するフラグを作成する
  • テキスト コンテンツ用の GameTextInput の状態バッファを直接使用する

次の図に示すように、アプリはユーザー テキスト入力用にさまざまな内部論理コンポーネントを使用します。

alt_text

組み込みの GameTextInput ライブラリの使用は、主に次の 3 つのステップに分けられます。

  • UI のソフト キーボードを制御する
  • 新しいテキストが利用可能になったことを認識する
  • ユーザー入力テキストとその状態を取得する

このドキュメントの後半では、上記について詳しく説明します。GameActivity が使用されている GameTextInput の実例については、games-samples リポジトリをご覧ください。

UI のソフト キーボードを制御する

GameActivity には、UI のソフト キーボードを制御するための関数が 2 つ用意されています。

これらの定義については、API リファレンス ドキュメントをご覧ください。キーボードが表示されたときのアプリの UI は次のようになります。

alt_text

テキストが利用可能かを確認する

ソフト キーボード イベントは、Java 側の GameTextInput から JNI を通じて C/C++ 側に渡され、GameActivity のラッパーまで進み、最終的に native_app_glue で実装されている android_app::textInputState フラグに反映されます。アプリは次のように、このフラグを定期的にポーリングして、目的の処理を実行する必要があります。

  • GameActivity で android_app::textInputState フラグを設定します。
  • アプリでそのフラグをポーリングし、新しい GameTextInput イベント(入力バッファに新しいテキストが追加されたなど)を処理します。
  • アプリで android_app::textInputState を消去します。

android_app::textInputState では、単一のテキスト入力イベントと複数のテキスト入力イベントが区別されないことに注意してください。

次の簡単な例では、アプリ サイクル コマンド、タッチイベント、キーイベントを処理した後、textInputState フラグをポーリングしています。

while (true) {
   // Read all pending events.
   int events;
   struct android_poll_source* source;

   while ((ALooper_pollAll(engine.animating ? 0 : -1, nullptr, &events,
                                 (void**)&source)) >= 0) {
       // Process this event, etc.
       ...
       // Check if we are exiting.
       if (app->destroyRequested != 0) {
           engine_term_display(&engine);
           return;
       }
   }
   engine_handle_input(app);

   // Process text input events if there is any outstanding.
   if (app->textInputState) {
       // process TextInput events.
          ...
       //reset the textInputState flag
       app->textInputState = 0;
   }
   if (engine.animating) {
         // draw frames.
   }
}

ユーザー入力テキストを取得する

入力テキストやその他の状態は、GameTextInput の内部バッファ GameTextInput::currentState_ に蓄積されます。アプリでは、次のいずれかの手段でコンテンツを取得できます。

  • GameActivity のラッパー API(推奨)
  • GameTextInput API

GameActivity API を使用して TextInput の状態を取得する

アプリは、次のような一般的なコールバック メカニズムで現在のテキスト入力を取得します。

  • テキスト入力イベントを処理する GameTextInputGetStateCallback 型のコールバック関数を実装します。
  • 未処理のイベントが 1 つ以上ある場合に、GameActivity_getInputState() を呼び出します。
  • イベントが処理されたら、android_app::textInputState を消去します。

前のセクションのスニペットに続き、次のコードで、テキスト入力バッファへの参照を取得し、それを処理して(省略)、イベントフラグをリセットします。

extern "C" void GameTextInputGetStateCB(void *ctx, const struct GameTextInputState *state) {
    auto* engine = (struct engine*)ctx;
    if (!engine || !state) return;

    // Process the text event(s).
    LOGI("UserInputText: %s", state->text_UTF8);

    // Clear the text input flag.
    engine->app->textInputState = 0;
}

前のセクションに示したゲームループで、上記のテキスト入力ハンドラを使用してテキストの確認と処理を行います。

if (state->textInputState) {
    GameActivity_getTextInputState(
        app->activity,
        GameTextInputGetStateCB,  // App's event handler shown above.
        &engine // Context to the GameTextInputGetStateCB function.
    );
}

必要に応じ、アプリは GameActivity_setTextInputState() を使用して GameTextInputState コンテンツを初期化できます。

GameTextInput API を使用して TextInput の状態を取得する

アプリで GameTextInput API を直接使用して、現在の GameTextInputState を取得することもできます。

  • GameActivity_getTextInput() を使用して、GameActivity の内部 GameTextInput インスタンスを取得します。
  • 取得した GameTextInput インスタンスを使用し、GameTextInput_getState() を呼び出して、同じ GameTextInputState コンテンツを取得します。

繰り返しますが、アプリでは GameTextInput を直接初期化しないでください。GameActivity の初期化プロセスですでに初期化されています。

コールバックのメカニズムは、GameActivity の GameActivity_getTextInputState() 関数で使用されるものと同じです。

関連情報

GameActivity アプリを作成する際は、以下のリソースを参考にしてください。

フィードバック

GameActivity と GameTextInput はどちらも Jetpack ゲーム ライブラリの一部です。問題を発見した場合や質問がある場合には、Google Issue Tracker でバグを登録してください。