TextInput in GameActivity Teil des Android Game Development Kit.

GameActivity-Integration GameTextInput von:

  • einen Wrapper bereitstellen,
  • Erstellen eines Flags für die Verfügbarkeit neuer Texteingabeereignisse
  • direkt über den Statuspuffer von GameTextInput für den Textinhalt

Wie im folgenden Diagramm dargestellt, verwenden Anwendungen verschiedene interne logische Komponenten für die Texteingabe durch den Nutzer:

Alt-Text

Zur Verwendung der integrierten GameTextInput-Bibliothek sind drei grundlegende Schritte erforderlich:

  • Soft Keyboard auf der Benutzeroberfläche steuern
  • Wissen, wenn neuer Text verfügbar ist
  • Nutzereingabetext und zugehörige Status abrufen

Im weiteren Verlauf dieses Dokuments werden sie ausführlich beschrieben. Ein Beispiel für GameTextInput mit GameActivity in Aktion – siehe Repository „Games-Beispiele“.

Softtastatur auf der Benutzeroberfläche steuern

GameActivity bietet zwei Funktionen zum Steuern der Bildschirmtastatur auf der Benutzeroberfläche:

Die Definitionen finden Sie in der API-Referenzdokumentation. Nach dem angezeigt wird, sieht die Benutzeroberfläche der Anwendung etwa so aus:

Alt-Text

Textverfügbarkeit prüfen

Ereignisse vom Typ „Soft Keyboard“ werden von GameTextInput auf der Java-Seite an den durch die JNI, gelangen dann zum Wrapper von GameActivity wird in Flag android_app::textInputState widergespiegelt in native_app_glue implementiert. Anwendungen sollte dieses Flag regelmäßig abfragen, um die gewünschte Verarbeitung durchzuführen:

  • GameActivity legt nur das Flag android_app::textInputState fest.
  • Anwendungen fragen das Flag ab und verarbeiten die neuen GameTextInput-Ereignisse. z. B. den neuen Text, der dem Eingabepuffer hinzugefügt wurde.
  • Anwendungen löschen den android_app::textInputState.

android_app::textInputState unterscheidet nicht zwischen einzelnen und mehrere Texteingabeereignisse.

In einem einfachen Beispiel fragt der folgende Code das Flag textInputState nach dem App-Zyklusbefehle, Touch-Ereignisse und Schlüsselereignisse verarbeiten:

while (true) {
   // Read all pending events.
   int events;
   struct android_poll_source* source;

   while ((ALooper_pollAll(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.
   }
}

Nutzereingabetext abrufen

Die Eingabetexte und andere Zustände werden im Feld interner Zwischenspeicher GameTextInput::currentState_. Anwendungen können Sie den Inhalt auf eine der folgenden Arten abrufen:

  • Wrapper API von GameActivity (empfohlen)
  • GameTextInput API

TextInput-Status mit der GameActivity API abrufen

Anwendungen rufen die aktuelle Texteingabe mit dem typischen Callback-Mechanismus ab:

  • Implementieren Sie eine Callback-Funktion vom Typ GameTextInputGetStateCallback, um Texteingabeereignisse zu verarbeiten.
  • GameActivity_getInputState() aufrufen, wenn mindestens eins vorhanden ist für wichtige Ereignisse.
  • Löschen Sie den Eintrag android_app::textInputState. nachdem die Ereignisse verarbeitet wurden.

Wir bleiben mit dem Snippet aus dem vorherigen Abschnitt ruft einen Verweis auf den Texteingabepuffer ab, verarbeitet ihn (nicht abgebildet) und setzt das Ereignis-Flag zurück:

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

Text in der im vorherigen Abschnitt gezeigten Spielschleife prüfen und verarbeiten mit dem obigen Texteingabe-Handler:

if (state->textInputState) {
    GameActivity_getTextInputState(
        app->activity,
        GameTextInputGetStateCB,  // App's event handler shown above.
        &engine // Context to the GameTextInputGetStateCB function.
    );
}

Anwendungen können den GameTextInputState-Inhalt optional mit folgendem Befehl initialisieren: GameActivity_setTextInputState()

TextInput-Status mit der GameTextInput API abrufen

Anwendungen können die GameTextInput API auch direkt verwenden, um den aktuellen GameTextInputState:

Anwendungen sollten GameTextInput nicht initialisieren direkt; GameActivity tut dies bereits während des Initialisierungsprozesses.

Der Callback-Mechanismus ist derselbe wie der vom GameActivity-Element GameActivity_getTextInputState().

Referenzen

Für Entwickler könnten die folgenden Ressourcen hilfreich sein, wenn Sie GameActivity-Apps:

Feedback

GameActivity und GameTextInput sind Teil der Jetpack-Spielebibliothek. Für alle Probleme und Fragen haben, erstellen Sie einen Fehler im Google IssueTracker.