GameTextInput Teil des Android Game Development Kit.

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

GameTextInput bietet eine einfache API zum Ein- oder Ausblenden der Bildschirmtastatur, zum Festlegen oder Abrufen des aktuell bearbeiteten Textes und zum Empfang von Benachrichtigungen, wenn der Text geändert wird. Dies ist nicht für vollwertige Texteditor-Apps gedacht, bietet aber weiterhin Unterstützung für die Auswahl und das Zusammensetzen von Regionen für typische Anwendungsfälle in Spielen. Außerdem unterstützt diese Bibliothek erweiterte Funktionen des Eingabemethoden-Editors (IME) wie Rechtschreibprüfung, Vervollständigungen und Mehrfachschlüsselzeichen.

GameTextInput akkumuliert den Eingabetext (zusammen mit den entsprechenden Status) intern an den internen Zwischenspeicher GameTextInput::currentState_ und benachrichtigt die App über entsprechende Änderungen. Die Anwendung führt dann in ihrer registrierten Callback-Funktion Textverarbeitung durch.

Verfügbarkeit

GameTextInput kann auf folgende Arten verwendet werden:

  • Gemeinsam mit GameActivity: GameActivity integriert GameTextInput. Anwendungen, die GameActivity nutzen, können nur den integrierten GameTextInput nutzen. Die Nutzungsanleitung ist auf der Seite „GameActivity“ vollständig dokumentiert. Ein Beispiel für die Integration von GameActivity und GameTextInput finden Sie im games-sample-Repository. Dieses Nutzungsmodell wird in diesem Leitfaden nicht behandelt.

  • Als eigenständige Bibliothek werden im restlichen Leitfaden die Nutzungsschritte beschrieben.

Beachten Sie, dass sich die beiden oben genannten Methoden gegenseitig ausschließen.

Formale GameTextInput-Releases sind in den folgenden Kanälen verfügbar:

In diesem Leitfaden wird der erste Anwendungsfall behandelt. Um die Zip-Datei-Releases zu verwenden, lesen Sie die im Lieferumfang enthaltene Anleitung.

Build einrichten

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

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

  2. 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 Paket game-text-input und fügen Sie es dem 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üge in eine der .cpp-Dateien in deinem Spiel die folgende Zeile ein, um die GameTextInput-Implementierung einzufügen:

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

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

Build einbinden

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

    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 den erstellten InputEnabledTextView dem UI-Layout hinzu. Mit dem folgenden Code in activity_main.xml kann er beispielsweise unten auf dem Bildschirm 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. Rufe diese neue InputEnabledTextView-Klasse in deiner Java-Aktivität ab. Dies ist relativ einfach, wenn Sie View Binding verwenden:

    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 der C-Bibliothek inputConnection an GameTextInput_setInputConnection. Übergeben Sie einen Callback in GameTextInput_setEventCallback, um über Ereignisse als C-State-Struktur GameTextInputState informiert 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 der C-Bibliothek GameTextInput_processEvent auf. Dadurch wird der im vorherigen Schritt registrierte Callback intern 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);
    }
    

Dienstfunktionen

Die GameTextInput-Bibliothek enthält Dienstfunktionen, mit denen Sie zwischen Java-Statusobjekten und C-Zustandsstrukturen konvertieren können. Mit den Funktionen GameTextInput_showIme und GameTextInput_hideIme können Sie auf Funktionen zum Ein- und Ausblenden des IME zugreifen.

Referenzen

Folgendes kann für Entwickler hilfreich sein, wenn sie Apps mit GameTextInput erstellen:

Feedback

Bei Problemen und Fragen zu GameTextInput kannst du den Fehler im Google IssueTracker erstellen.