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:
- Veröffentlichung der Jetpack-Spielebibliothek in Google Maven
- Zip-Datei-Releases auf der AGDK-Downloadseite
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.
Folgen Sie der Anleitung auf der Seite Jetpack Android Games, um die Abhängigkeit der
GameTextInput
-Bibliothek zur Dateibuild.gradle
Ihres Spiels hinzuzufügen. Hinweis: Wenn Ihre Anwendungen GameActivity verwenden, können sie die eigenständigeGameTextInput
-Bibliothek nicht nutzen.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
Importieren Sie das Paket
game-text-input
und fügen Sie es dem Ziel in der DateiCMakeLists.txt
Ihres Projekts hinzu:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)
Füge in eine der
.cpp
-Dateien in deinem Spiel die folgende Zeile ein, um dieGameTextInput
-Implementierung einzufügen:#include <game-text-input/gametextinput.cpp>
Fügen Sie in die Quelldateien, die die C API
GameTextInput
verwenden, die Headerdatei ein:#include <game-text-input/gametextinput.h>
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 IhreCMakeLists.txt
-Konfigurationsdatei.
Build einbinden
Rufen Sie aus dem C-Thread, der bereits an die JVM angehängt ist, oder aus dem Hauptthread der Anwendung
GameTextInput_init
mit einemJNIEnv
-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); ... }
Erstellen Sie eine
InputEnabledTextView
-Java-Klasse mit Zugriff aufInputConnection
.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); }
Fügen Sie den erstellten
InputEnabledTextView
dem UI-Layout hinzu. Mit dem folgenden Code inactivity_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" />
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); }
Übergeben Sie in der C-Bibliothek
inputConnection
anGameTextInput_setInputConnection
. Übergeben Sie einen Callback inGameTextInput_setEventCallback
, um über Ereignisse als C-State-StrukturGameTextInputState
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); }
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:
- GameTextInput-Test-App
- GameTextInput mit GameActivity verwenden
- GameTextInput-Referenzdokument
- GameTextInput-Quellcode
Feedback
Bei Problemen und Fragen zu GameTextInput
kannst du den Fehler im Google IssueTracker erstellen.