GameTextInput   Parte de Android Game Development Kit.

El uso de la biblioteca de GameTextInput es una alternativa más simple a escribir una app para Android en pantalla completa que usa el teclado en pantalla para la entrada de texto.

GameTextInput proporciona una API sencilla a fin de mostrar u ocultar el teclado en pantalla, establecer o recibir el texto editado actualmente, y recibir notificaciones cuando se cambia el texto. Esto no está diseñado para apps completas de editor de texto; pero, aun así, proporciona compatibilidad con la selección y composición de regiones para casos de uso típicos en juegos. Además, esta biblioteca admite funciones avanzadas del Editor de método de entrada (IME), como la corrección ortográfica, las finalizaciones y los caracteres de varias teclas.

Internamente, GameTextInput acumula el texto de entrada (junto con los estados relevantes) en el búfer interno GameTextInput::currentState_ y notifica a la app sobre los cambios. Luego, la app realiza el procesamiento de texto en su función de devolución de llamada registrada.

Disponibilidad

GameTextInput se puede usar de las siguientes maneras:

  • Junto con GameActivity: GameActivity integra GameTextInput. Las aplicaciones que usan GameActivity solo pueden usar el GameTextInput integrado. Las instrucciones de uso están totalmente documentadas en la página de GameActivity. Si quieres ver un ejemplo de integración de GameActivity y GameTextInput consulta el repositorio de muestras de juegos. Este modelo de uso no está dentro del alcance de esta guía.

  • Como biblioteca independiente: el resto de la guía describe los pasos de uso.

Ten en cuenta que los dos métodos anteriores son mutuamente excluyentes.

Las versiones formales de GameTextInput están disponibles en los siguientes canales:

En esta guía, se explica el caso de primer uso. Para usar las versiones de archivos zip, consulta las instrucciones que se incluyen en el paquete.

Cómo configurar tu compilación

GameTextInput se distribuye como un Android ARchive (AAR). Este AAR contiene las clases de Java y el código fuente C, que implementa las características nativas de GameTextInput. Debes incluir estos archivos fuente como parte del proceso de compilación a través de Prefab, que expone bibliotecas nativas y código fuente a tu proyecto de CMake o compilación del NDK.

  1. Sigue las instrucciones en la página de juegos de Android para Jetpack para agregar la dependencia de la biblioteca GameTextInput al archivo build.gradle de tu juego. Ten en cuenta que si tus aplicaciones usan GameActivity, no pueden usar la biblioteca GameTextInput independiente.

  2. Asegúrate de que gradle.properties contenga las siguientes líneas:

    # Tell Android Studio we are using AndroidX.
    android.useAndroidX=true
    # Use Prefab 1.1.2 or higher, which contains a fix for "header only" libs.
    android.prefabVersion=1.1.2
    # Required only if you're using Android Studio 4.0 (4.1 is recommended).
    # android.enablePrefab=true
    
  3. Importa el paquete game-text-input y agrégalo a tu destino en el archivo CMakeLists.txt de tu proyecto:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. En uno de los archivos .cpp de tu juego, agrega la siguiente línea para incluir la implementación de GameTextInput:

    #include <game-text-input/gametextinput.cpp>
    
  5. En los archivos de origen que usan la API de GameTextInput para C, incluye el archivo del encabezado:

    #include <game-text-input/gametextinput.h>
    
  6. Compila y ejecuta la app. Si tienes errores de CMake, verifica que el AAR y los archivos build.gradle estén configurados correctamente. Si no se encuentra el archivo #include, verifica tu archivo de configuración CMakeLists.txt.

Cómo integrar tu compilación

  1. Desde tu subproceso C que ya se adjuntó a JVM o el subproceso principal de la app, llama a GameTextInput_init con un puntero JNIEnv.

    static GameTextInput* gameTextInput = nullptr;
    
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_gametextinput_testbed_MainActivity_onCreated(JNIEnv* env,
      jobject this) {
    {
        if(!gameTextInput)
          gameTextInput = GameTextInput_init(env);
        ...
    }
    
  2. Crea una clase InputEnabledTextView de Java con acceso a InputConnection.

    public class InputEnabledTextView extends View implements Listener {
      public InputConnection mInputConnection;
      public InputEnabledTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
      }
    
      public InputEnabledTextView(Context context) {
        super(context);
      }
      public void createInputConnection(int inputType) {
        EditorInfo editorInfo = new EditorInfo();
        editorInfo.inputType = inputType;
        editorInfo.actionId = IME_ACTION_NONE;
        editorInfo.imeOptions = IME_FLAG_NO_FULLSCREEN;
        mInputConnection = new InputConnection(this.getContext(), this,
                new Settings(editorInfo, true)
        ).setListener(this);
      }
    
      @Override
      public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        if (outAttrs != null) {
            GameTextInput.copyEditorInfo(mInputConnection.getEditorInfo(), outAttrs);
        }
        return mInputConnection;
      }
    
      // Called when the IME input changes.
      @Override
      public void stateChanged(State newState, boolean dismissed) {
        onTextInputEventNative(newState);
      }
      @Override
      public void onImeInsetsChanged(Insets insets) {
        // handle Inset changes here
      }
    
      private native void onTextInputEventNative(State softKeyboardEvent);
    }
    
  3. Agrega el elemento InputEnabledTextView creado al diseño de la IU. Por ejemplo, el siguiente código de activity_main.xml se puede colocar en la parte inferior de la pantalla:

    <com.android.example.gametextinputjava.InputEnabledTextView
        android:id="@+id/input_enabled_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
    
  4. Recupera esta nueva clase InputEnabledTextView para tu actividad de Java. Esto es relativamente simple cuando usas vinculación de vistas:

    public class MainActivity extends AppCompatActivity {
      ...
      private ActivityMainBinding binding;
      private InputEnabledTextView inputEnabledTextView;
    
      private native void setInputConnectionNative(InputConnection c);
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        ...
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        inputEnabledTextView = binding.inputEnabledTextView;
        inputEnabledTextView.createInputConnection(InputType.TYPE_CLASS_TEXT);
        setInputConnectionNative(inputEnabledTextView.mInputConnection);
      }
    
  5. En tu biblioteca de C, pasa inputConnection a GameTextInput_setInputConnection. Pasa una devolución de llamada en GameTextInput_setEventCallback para recibir notificaciones de eventos como estructuras de estado C GameTextInputState.

    extern "C"JNIEXPORT void JNICALL
    Java_com_gametextinput_testbed_MainActivity_setInputConnectionNative(
      JNIEnv *env, jobject this, jobject inputConnection) {
      GameTextInput_setInputConnection(gameTextInput, inputConnection);
      GameTextInput_setEventCallback(gameTextInput,[](void *ctx, const GameTexgtInputState *state) {
        if (!env || !state) return;
        // process the newly arrived text input from user.
        __android_log_print(ANDROID_LOG_INFO, "TheGreateGameTextInput", state->text_UTF8);
      }, env);
    }
    
  6. En la biblioteca de C, llama a GameTextInput_processEvent , que internamente realiza una llamada a la devolución de llamada registrada en el paso anterior para que tu app controle eventos cuando cambie el estado.

    extern "C"
    JNIEXPORT void JNICALL
    Java_com_gametextinput_testbed_InputEnabledTextView_onTextInputEventNative(
      JNIEnv* env, jobject this, jobject soft_keyboard_event) {
      GameTextInput_processEvent(gameTextInput, soft_keyboard_event);
    }
    

Funciones de utilidad

La biblioteca de GameTextInput incluye funciones de utilidad que te permiten realizar la conversión entre objetos de estado Java y estructuras de estado C. Accede a la funcionalidad con el fin de mostrar y ocultar el IME mediante las funciones GameTextInput_showIme y GameTextInput_hideIme.

Referencias

A los desarrolladores puede resultarles útil al cuando crean apps con GameTextInput:

Comentarios

Si tienes problemas o preguntas, relacionadas con GameTextInput, crea un error en la Herramienta de seguimiento de errores de Google.