GameActivity 中的文本输入   隶属于 Android 游戏开发套件

GameActivity 集成了 GameTextInput,通过

  • 提供封装器
  • 为新的文本输入事件可用性创建标志
  • 直接使用 GameTextInput 的状态缓冲区来存储文本内容

如下图所示,应用使用不同的内部逻辑组件来实现用户文本输入功能

alt_text

使用内置的 GameTextInput 库主要有三个步骤

  • 控制 UI 上的软键盘
  • 了解何时有新文本可用
  • 检索用户输入的文本及其状态

本文档的其余部分将详细介绍这些步骤。如需了解 GameTextInputGameActivity 配合使用的示例,请参阅 games-samples 代码库

控制 UI 上的软键盘

GameActivity 提供了两个函数来控制 UI 上的软键盘

如需了解其定义,请参阅 API 参考文档。键盘显示后,应用的用户界面可能如下所示

alt_text

检查文本可用性

软键盘事件从 GameTextInput 的 Java 端通过 JNI 传递到 C/C++ 端,然后传递到 GameActivity 的封装器,最终反映在 android_app::textInputState 标志中,此标志在 native_app_glue 中实现。应用应定期轮询此标志以执行预期的处理

  • 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_pollOnce(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 状态

应用使用典型的回调机制获取当前文本输入

接着上一部分中的代码段,以下代码获取对文本输入缓冲区的引用,对其进行处理(未显示),并重置事件标志

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

同样,请注意,应用不应直接初始化 GameTextInputGameActivity 已在其初始化过程中执行此操作。

回调机制与 GameActivity 的 GameActivity_getTextInputState() 函数所使用的机制相同。

参考资料

开发者在创建 GameActivity 应用时可能会发现以下资源很有帮助

反馈

GameActivity 和 GameTextInput 都是 Jetpack 游戏库的一部分。如有任何问题,请在 Google IssueTracker 上提交 bug