GameTextInput   Teil des Android Game Development Kit.

Die Verwendung der GameTextInput-Bibliothek ist eine einfachere Alternative zum Schreiben einer Vollbild-Android-App, die die Bildschirmtastatur für die Texteingabe verwendet.

GameTextInput bietet eine einfache API zum Einblenden oder Ausblenden der Bildschirmtastatur, zum Festlegen oder Abrufen des aktuell bearbeiteten Texts und zum Empfangen von Benachrichtigungen, wenn der Text geändert wird. Dies ist nicht für vollwertige Texteditor-Apps gedacht, bietet aber dennoch Unterstützung für die Auswahl und das Verfassen von Text in typischen Anwendungsfällen in Spielen. Außerdem unterstützt diese Bibliothek erweiterte IME-Funktionen (Input Method Editor, Eingabemethoden-Editor) wie Rechtschreibprüfung, Vervollständigungen und Zeichen mit mehreren Tasten.

Intern wird im Feld GameTextInput der eingegebene Text (zusammen mit den relevanten Status) im internen Puffer GameTextInput::currentState_ gespeichert und die App wird über alle Änderungen informiert. Die App führt dann die Textverarbeitung in ihrer registrierten Rückruffunktion durch.

Verfügbarkeit

GameTextInput kann auf folgende Arten verwendet werden:

  • Zusammen mit GameActivity: GameActivity integriert GameTextInput. Anwendungen, die GameActivity verwenden, können nur die integrierte GameTextInput verwenden. Eine vollständige Dokumentation der Verwendung finden Sie auf der Seite „GameActivity“ . Ein Beispiel für die Integration von GameActivity und GameTextInput finden Sie im games-samples-Repository. Dieses Nutzungsmodell wird in diesem Leitfaden nicht behandelt.

  • Als eigenständige Bibliothek: Die restlichen Schritte zur Verwendung werden im weiteren Verlauf des Leitfadens beschrieben.

Die beiden oben genannten Methoden schließen sich gegenseitig aus.

Offizielle GameTextInput-Releases sind im [Google Maven][google-maven]{:.external}-Release der Jetpack-Spielebibliothek verfügbar.

Build einrichten

GameTextInput wird als Android-Archiv (AAR) bereitgestellt. Dieses AAR enthält die Java-Klassen und den C-Quellcode, der die nativen Funktionen von GameTextInput implementiert. Sie müssen diese Quelldateien über Prefab in Ihren Build-Prozess einbeziehen. Dadurch werden native Bibliotheken und Quellcode für Ihr CMake-Projekt oder Ihren NDK-Build verfügbar gemacht.

  1. Folgen Sie der Anleitung auf der Seite Jetpack Android Games, um die GameTextInput-Bibliotheksabhängigkeit der build.gradle-Datei Ihres Spiels hinzuzufügen. Wenn Ihre Anwendungen GameActivity verwenden, können sie die eigenständige GameTextInput-Bibliothek nicht verwenden.

  2. Die Datei gradle.properties muss die folgenden Zeilen enthalten:

    # 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. Importieren Sie das game-text-input-Paket und fügen Sie es Ihrem Ziel in der Datei CMakeLists.txt Ihres Projekts hinzu:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. Fügen Sie in einer der .cpp-Dateien Ihres Spiels die folgende Zeile hinzu, um die GameTextInput-Implementierung einzufügen:

    #include <game-text-input/gametextinput.cpp>
    
  5. Fügen Sie in die Quelldateien, die die GameTextInput C-API verwenden, die Headerdatei ein:

    #include <game-text-input/gametextinput.h>
    
  6. Kompilieren Sie die App und führen Sie sie aus. Wenn CMake-Fehler auftreten, prüfen Sie, ob die AAR- und build.gradle-Dateien richtig eingerichtet sind. Wenn die Datei #include nicht gefunden wird, prüfen Sie die Konfigurationsdatei CMakeLists.txt.

Build einbinden

  1. Rufen Sie GameTextInput_init mit einem JNIEnv-Zeiger aus dem C-Thread auf, der bereits an die JVM angehängt ist, oder aus dem Hauptthread der App.

    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. Erstellen Sie eine InputEnabledTextView-Java-Klasse mit Zugriff auf 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. Fügen Sie das erstellte InputEnabledTextView dem UI-Layout hinzu. Mit dem folgenden Code in activity_main.xml kann die Anzeige beispielsweise am unteren Rand des Bildschirms platziert werden:

    <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. Rufen Sie diese neue InputEnabledTextView-Klasse in Ihrer Java-Aktivität ab. Mit View Binding ist das relativ einfach:

    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. Übergeben Sie in Ihrer C-Bibliothek inputConnection an GameTextInput_setInputConnection. Übergeben Sie einen Callback in GameTextInput_setEventCallback, um über Ereignisse als C-Status-Struct GameTextInputState benachrichtigt zu werden.

    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. Rufen Sie in Ihrer C-Bibliothek GameTextInput_processEvent auf. Dadurch wird intern Ihr im vorherigen Schritt registrierter Callback aufgerufen, damit Ihre App Ereignisse verarbeiten kann, wenn sich der Status ändert.

    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);
    }
    

Hilfsfunktionen

Die GameTextInput-Bibliothek enthält Dienstprogrammfunktionen, mit denen Sie zwischen Java-Statusobjekten und C-Statusstrukturen konvertieren können. Zugriff auf Funktionen zum Ein- und Ausblenden der IME über die Funktionen GameTextInput_showIme und GameTextInput_hideIme.

Referenzen

Entwickler finden möglicherweise die folgenden Informationen hilfreich, wenn sie Apps mit GameTextInput erstellen:

Feedback

Bei Problemen und Fragen zu GameTextInput erstellen Sie einen Fehler im Google IssueTracker.