GameTextInput   Teil des Android Game Development Kits.

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

GameTextInput bietet eine einfache API, mit der Sie die Soft-Tastatur ein- oder ausblenden, den aktuell bearbeiteten Text festlegen oder abrufen und Benachrichtigungen erhalten können, wenn der Text geändert wird. Diese Funktion ist nicht für vollwertige Texteditor-Apps gedacht, bietet aber dennoch Unterstützung für die Auswahl und das Erstellen von Textbereichen 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 Zeichen mit mehreren Tasten.

Intern sammelt GameTextInput den Eingabetext (zusammen mit den relevanten Status) im internen Puffer GameTextInput::currentState_ und benachrichtigt die App über Änderungen. Die App führt dann die Textverarbeitung in der registrierten Rückruffunktion aus.

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 ausführliche Anleitung finden Sie auf der Seite „GameActivity“ . Ein Beispiel für die Integration von GameActivity und GameTextInput finden Sie im Repository „games-samples“. Dieses Nutzungsmodell fällt nicht in den Geltungsbereich dieses Leitfadens.

  • Als eigenständige Bibliothek: Im Rest des Leitfadens werden die Schritte zur Verwendung beschrieben.

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

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

Build einrichten

GameTextInput wird als Android-Archiv (AAR) bereitgestellt. Diese AAR enthält die Java-Klassen und den C-Quellcode, in dem die nativen Funktionen von GameTextInput implementiert sind. Sie müssen diese Quelldateien im Rahmen Ihres Build-Prozesses über Prefab einbinden. Dadurch werden native Bibliotheken und Quellcode für Ihr CMake-Projekt oder NDK-Build freigegeben.

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

  2. Achten Sie darauf, dass gradle.properties die folgenden Zeilen enthält:

    # 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 dem Ziel in der CMakeLists.txt-Datei 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 in Ihrem Spiel die folgende Zeile hinzu, um die GameTextInput-Implementierung einzubinden:

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

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

Build einbinden

  1. Rufen Sie GameTextInput_init mit einem JNIEnv-Zeiger aus Ihrem C-Thread, der bereits an die JVM angehängt ist, oder aus dem Haupt-Thread der App 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 die erstellte InputEnabledTextView dem UI-Layout hinzu. Mit dem folgenden Code in activity_main.xml kann es 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. Das ist mithilfe der Bindung an Ansichten 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 Rückruf in GameTextInput_setEventCallback, um über Ereignisse als C-Statusstruktur 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, wodurch intern der im vorherigen Schritt registrierte Rückruf aufgerufen wird, damit Ihre App Ereignisse bei Statusänderungen verarbeiten kann.

    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 Dienstprogrammfunktionen, mit denen Sie zwischen Java-Statusobjekten und C-Statusstrukturen konvertieren können. Über die Funktionen GameTextInput_showIme und GameTextInput_hideIme können Sie die IME ein- und ausblenden.

Referenzen

Entwicklern kann Folgendes beim Erstellen von Apps mit GameTextInput helfen:

Feedback

Wenn Sie Probleme oder Fragen zu GameTextInput haben, erstellen Sie einen Fehler im Google IssueTracker.