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.
Folgen Sie der Anleitung auf der Seite Jetpack Android Games, um die
GameTextInput
-Bibliotheksabhängigkeit derbuild.gradle
-Datei Ihres Spiels hinzuzufügen. Wenn Ihre Anwendungen GameActivity verwenden, können sie die eigenständigeGameTextInput
-Bibliothek nicht verwenden.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
Importieren Sie das
game-text-input
-Paket und fügen Sie es Ihrem 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ügen Sie in einer der
.cpp
-Dateien Ihres Spiels die folgende Zeile hinzu, um dieGameTextInput
-Implementierung einzufügen:#include <game-text-input/gametextinput.cpp>
Fügen Sie in die Quelldateien, die die
GameTextInput
C-API verwenden, die Headerdatei ein:#include <game-text-input/gametextinput.h>
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 KonfigurationsdateiCMakeLists.txt
.
Build einbinden
Rufen Sie
GameTextInput_init
mit einemJNIEnv
-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); ... }
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 das erstellte
InputEnabledTextView
dem UI-Layout hinzu. Mit dem folgenden Code inactivity_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" />
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); }
Übergeben Sie in Ihrer C-Bibliothek
inputConnection
anGameTextInput_setInputConnection
. Übergeben Sie einen Callback inGameTextInput_setEventCallback
, um über Ereignisse als C-Status-StructGameTextInputState
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); }
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:
- GameTextInput-Test-App
- GameTextInput mit GameActivity verwenden
- GameTextInput-Referenzdokument
- GameTextInput-Quellcode
Feedback
Bei Problemen und Fragen zu GameTextInput
erstellen Sie einen Fehler im Google IssueTracker.