TextInput na GameActivity Parte do Android Game Development Kit.
A GameActivity integra a GameTextInput, executando os processos abaixo:
- Fornece um wrapper.
- Cria uma sinalização para novos eventos de entrada de texto.
- Usa o buffer de estado da GameTextInput para o conteúdo do texto.
Como mostrado no diagrama abaixo, os aplicativos usam diferentes componentes de lógica interna para processar entradas de texto do usuário:

Para usar a biblioteca GameTextInput integrada, é necessário implementar três etapas gerais:
- Controlar o teclado de software na IU.
- Saber quando um novo texto está disponível.
- Extrair o texto de entrada do usuário e os estados dele.
No restante deste documento, essas etapas vão ser explicadas em detalhes. Para ver um exemplo da
GameTextInput com a GameActivity em ação, consulte o
repositório games-samples (link em inglês).
Controlar o teclado de software na IU
A GameActivity oferece duas funções para controlar o teclado de software na IU:
- GameActivity_showSoftInput()mostra o teclado de software.
- GameActivity_hideSoftInput()oculta o teclado de software.
Consulte a documentação de referência da API para conferir as definições de cada uma. Quando o teclado é mostrado, a IU do app pode ficar parecida com esta:

Verificar a disponibilidade de texto
Os eventos de teclado de software são transmitidos de GameTextInput em Java para
C/C++ pelo JNI. Depois disso, eles são transmitidos para o wrapper da GameActivity e, finalmente,
refletidos na sinalização android_app::textInputState
implementada em native_app_glue. Os apps
precisam consultar essa sinalização periodicamente para realizar o processamento pretendido:
- A GameActivity só define a sinalização android_app::textInputState.
- Os apps consultam a sinalização e processam os novos eventos GameTextInput, como o novo texto adicionado ao buffer de entrada.
- Os apps limpam o android_app::textInputState.
Observe que android_app::textInputState não diferencia eventos de entrada de texto
com apenas uma ou com várias palavras.
Para um exemplo simples, o código abaixo consulta a sinalização textInputState depois
de processar comandos de ciclo de funcionamento do app, eventos de toque e eventos de pressionamento de tecla:
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.
   }
}
Extrair o texto da entrada do usuário
Os textos de entrada e outros estados são acumulados no buffer interno
da GameTextInput, GameTextInput::currentState_. Os apps
podem usar um dos abaixo processos para extrair esse conteúdo:
- Wrapper da API GameActivity (recomendado)
- API GameTextInput
Extrair o estado de TextInput da API GameActivity
Os aplicativos recebem a entrada de texto atual usando um mecanismo de callback típico:
- Implemente uma função de callback do tipo GameTextInputGetStateCallbackpara processar eventos de entrada de texto.
- Chame GameActivity_getInputState()quando houver um ou vários eventos pendentes.
- Limpe android_app::textInputStatedepois de processar os eventos.
Continuando com o snippet da seção anterior, o código abaixo recebe uma referência ao buffer de entrada de texto, processa esse texto (não demonstrado) e redefine a sinalização do evento:
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;
}
Use o gerenciador de entrada de texto acima para consultar e processar o texto no loop de jogo apresentado na seção anterior:
if (state->textInputState) {
    GameActivity_getTextInputState(
        app->activity,
        GameTextInputGetStateCB,  // App's event handler shown above.
        &engine // Context to the GameTextInputGetStateCB function.
    );
}
Os apps podem inicializar o conteúdo GameTextInputState com
GameActivity_setTextInputState().
Extrair o estado de TextInput da API GameTextInput
Os aplicativos também podem usar diretamente a API GameTextInput para extrair o GameTextInputState atual:
- Use GameActivity_getTextInput()para extrair a instânciaGameTextInputinterna da GameActivity.
- Com a instância GameTextInputem mãos, chameGameTextInput_getState()para extrair o mesmo conteúdo deGameTextInputState.
Observe novamente que os aplicativos não podem inicializar GameTextInput
diretamente. A GameActivity já faz isso durante o processo de inicialização.
O mecanismo de callback é o mesmo usado pela função
GameActivity_getTextInputState() da GameActivity.
Referências
Os recursos abaixo podem ser úteis para desenvolvedores ao criar
aplicativos GameActivity:
- Guia de introdução à GameActivity
- Documentação do usuário da GameTextInput
- Exemplo de agdkTunnel (em inglês)
- Documentação de referência do Jetpack para a GameActivity
- Documentação de referência do Jetpack para a GameTextInput
- Código-fonte do AGDK
Feedback
A GameActivity e a GameTextInput fazem parte da biblioteca de jogos do Jetpack. Em caso de problemas ou dúvidas, crie um relatório de bug no IssueTracker do Google.
