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.
Folgen Sie der Anleitung auf der Seite Jetpack Android Games, um der
build.gradle
-Datei Ihres Spiels dieGameTextInput
-Bibliothek als Abhängigkeit hinzuzufügen. Wenn Ihre Anwendungen GameActivity verwenden, können sie die eigenständigeGameTextInput
-Bibliothek nicht verwenden.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
Importieren Sie das
game-text-input
-Paket und fügen Sie es dem Ziel in derCMakeLists.txt
-Datei 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 in Ihrem Spiel die folgende Zeile hinzu, um dieGameTextInput
-Implementierung einzubinden:#include <game-text-input/gametextinput.cpp>
Fügen Sie in den Quelldateien, in denen die
GameTextInput
C API verwendet wird, die Headerdatei ein:#include <game-text-input/gametextinput.h>
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 dieCMakeLists.txt
-Konfigurationsdatei.
Build einbinden
Rufen Sie
GameTextInput_init
mit einemJNIEnv
-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); ... }
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 die erstellte
InputEnabledTextView
dem UI-Layout hinzu. Mit dem folgenden Code inactivity_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" />
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); }
Übergeben Sie in Ihrer C-Bibliothek
inputConnection
anGameTextInput_setInputConnection
. Übergeben Sie einen Rückruf inGameTextInput_setEventCallback
, um über Ereignisse als C-StatusstrukturGameTextInputState
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, 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:
- Test-App für GameTextInput
- GameTextInput mit GameActivity verwenden
- Referenzdokument für GameTextInput
- GameTextInput-Quellcode
Feedback
Wenn Sie Probleme oder Fragen zu GameTextInput
haben, erstellen Sie einen Fehler im Google IssueTracker.