GameTextInput Bagian dari Android Game Development Kit.
Menggunakan library GameTextInput adalah
cara lain yang lebih sederhana untuk menulis aplikasi Android layar penuh yang menggunakan keyboard
virtual untuk input teks.
GameTextInput menyediakan API yang mudah digunakan untuk menampilkan atau menyembunyikan keyboard
virtual, menetapkan atau mendapatkan teks yang saat ini sedang diedit, dan menerima notifikasi saat
teks diubah. Hal ini tidak dimaksudkan untuk aplikasi editor teks lengkap, tetapi
masih memberikan dukungan region pemilihan dan penulisan untuk kasus penggunaan umum dalam
game. Selain itu, library ini juga mendukung fitur editor metode input
(IME) lanjutan seperti pemeriksaan
ejaan, pelengkapan, dan karakter multi-kunci.
Secara internal, GameTextInput mengumpulkan teks input (bersama dengan
status yang relevan) ke buffer internal GameTextInput::currentState_ dan memberi tahu
aplikasi tentang perubahan apa pun di dalamnya. Kemudian, aplikasi melakukan pemrosesan teks di fungsi callback yang terdaftar.
Ketersediaan
GameTextInput dapat digunakan dengan cara berikut:
Bersama dengan GameActivity: GameActivity mengintegrasikan GameTextInput. Aplikasi yang menggunakan GameActivity hanya dapat menggunakan GameTextInput terintegrasi. Petunjuk penggunaan didokumentasikan sepenuhnya di halaman GameActivity . Untuk contoh integrasi GameActivity dan GameTextInput, lihat repositori games-samples. Model penggunaan ini tidak termasuk dalam cakupan panduan ini.
Sebagai library mandiri: bagian panduan lainnya menjelaskan langkah-langkah penggunaan.
Perhatikan bahwa kedua metode di atas tidak dapat terjadi bersamaan.
Rilis GameTextInput formal tersedia dalam rilis library game Jetpack di Google Maven.
Menyiapkan build
GameTextInput didistribusikan sebagai Android Archive (AAR). AAR ini berisi class Java dan
kode sumber C yang mengimplementasikan fitur native GameTextInput. Anda
harus menyertakan file sumber ini sebagai bagian dari proses build melalui
Prefab,
yang mengekspos library native dan kode sumber ke project CMake atau build NDK.
Ikuti petunjuk di halaman Jetpack Android Games untuk menambahkan dependensi library
GameTextInputke filebuild.gradlegame Anda. Perhatikan bahwa jika aplikasi Anda menggunakan GameActivity, aplikasi tersebut tidak dapat menggunakan libraryGameTextInputmandiri.Pastikan
gradle.propertiesberisi baris berikut:# 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=trueImpor paket
game-text-inputdan tambahkan ke target Anda dalam fileCMakeLists.txtproject Anda:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)Di salah satu file
.cppdi game Anda, tambahkan baris berikut untuk menyertakan penerapanGameTextInput:#include <game-text-input/gametextinput.cpp>Dalam file sumber yang menggunakan
GameTextInputC API, sertakan file header:#include <game-text-input/gametextinput.h>Mengompilasi dan menjalankan aplikasi. Jika Anda memiliki error CMake, verifikasi file AAR dan
build.gradleyang telah disiapkan dengan benar. Jika file#includetidak ditemukan, verifikasi file konfigurasiCMakeLists.txtAnda.
Mengintegrasikan build
Dari thread C yang sudah terlampir ke JVM, atau thread utama aplikasi, panggil
GameTextInput_initdengan pointerJNIEnv.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); ... }Buat class Java
InputEnabledTextViewdengan akses keInputConnection.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); }Tambahkan
InputEnabledTextViewyang dibuat ke tata letak UI. Misalnya, kode berikut diactivity_main.xmldapat memosisikannya di bagian bawah layar:<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" />Ambil class
InputEnabledTextViewbaru ini ke aktivitas Java Anda. Proses ini relatif sederhana jika Anda menggunakan View Binding: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); }Di library C, teruskan
inputConnectionkeGameTextInput_setInputConnection. Teruskan callback diGameTextInput_setEventCallbackuntuk diberi tahu tentang peristiwa sebagai struktur status CGameTextInputState.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); }Di library C, panggil
GameTextInput_processEvent, yang secara internal memanggil callback yang terdaftar di langkah sebelumnya, agar aplikasi Anda dapat menangani peristiwa saat status berubah.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); }
Fungsi utilitas
Library GameTextInput menyertakan fungsi utilitas yang memungkinkan Anda mengonversi
objek status Java dan struktur status C. Akses fungsionalitas untuk menampilkan
dan menyembunyikan IME melalui fungsi
GameTextInput_showIme
dan
GameTextInput_hideIme.
Referensi
Developer mungkin merasa bahwa hal berikut bermanfaat saat membuat aplikasi dengan
GameTextInput:
- Aplikasi pengujian GameTextInput
- Menggunakan GameTextInput dengan GameActivity
- Dokumen Referensi GameTextInput
- Kode sumber GameTextInput
Masukan
Untuk masalah dan pertanyaan apa pun terkait GameTextInput, buat
bug di Google IssueTracker.