TextInput di GameActivity Bagian dari Android Game Development Kit.
GameActivity mengintegrasikan GameTextInput dengan:
- memberikan wrapper
- membuat flag untuk ketersediaan peristiwa input teks baru
- secara langsung menggunakan buffering status GameTextInput untuk konten teks
Seperti yang ditunjukkan pada diagram berikut, aplikasi menggunakan komponen logis internal yang berbeda untuk tujuan input teks pengguna:
Ada tiga langkah umum untuk menggunakan library GameTextInput
bawaan:
- Mengontrol keyboard virtual di UI
- Mengetahui kapan teks baru tersedia
- Mengambil teks input pengguna dan statusnya
Bagian lainnya dalam dokumen ini menjelaskannya secara mendetail. Untuk contoh GameTextInput
dengan cara kerja GameActivity
, lihat repositori games-samples.
Mengontrol keyboard virtual di UI
GameActivity
menyediakan dua fungsi untuk mengontrol keyboard virtual di UI:
GameActivity_showSoftInput()
menampilkan keyboard virtual.GameActivity_hideSoftInput()
menyembunyikan keyboard virtual.
Lihat dokumen referensi API untuk mengetahui definisinya. Setelah keyboard ditampilkan, UI aplikasi mungkin terlihat seperti berikut:
Memeriksa ketersediaan teks
Peristiwa keyboard virtual diteruskan dari GameTextInput
pada sisi Java ke
sisi C/C++ melalui JNI, lalu dilanjutkan ke wrapper GameActivity, dan akhirnya
merefleksikan flag yang diterapkan
dalam native_app_glue
di android_app::textInputState
. Aplikasi
harus melakukan polling flag ini secara berkala untuk melakukan pemrosesan yang dimaksud:
- GameActivity hanya menetapkan flag
android_app::textInputState
. - Aplikasi melakukan polling flag dan menangani peristiwa
GameTextInput
baru, seperti teks baru yang ditambahkan ke buffering input. - Aplikasi menghapus
android_app::textInputState
.
Perhatikan bahwa android_app::textInputState
tidak membedakan antara
satu dan beberapa peristiwa input teks tunggal.
Sebagai contoh sederhana, kode berikut melakukan polling flag textInputState
setelah
menangani perintah siklus aplikasi, peristiwa sentuh, dan peristiwa penting:
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.
}
}
Mengambil teks input pengguna
Teks input dan status lainnya diakumulasi di buffering internal GameTextInput, GameTextInput::currentState_
. Aplikasi
dapat menggunakan salah satu cara berikut untuk mengambil kontennya:
- Wrapper API GameActivity (disarankan)
- GameTextInput API
Mendapatkan status TextInput dengan GameActivity API
Aplikasi memperoleh input teks saat ini dengan mekanisme callback yang umum:
- Mengimplementasikan fungsi callback jenis
GameTextInputGetStateCallback
untuk memproses peristiwa input teks. - Memanggil
GameActivity_getInputState()
jika ada satu atau beberapa peristiwa yang belum terselesaikan. - Menghapus
android_app::textInputState
setelah peristiwa diproses.
Melanjutkan dengan cuplikan di bagian sebelumnya, kode berikut mendapatkan referensi ke buffering input teks, memprosesnya (tidak ditampilkan), dan mereset flag peristiwa:
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;
}
Pada game loop yang ditampilkan di bagian sebelumnya, periksa dan proses teks dengan pengendali input teks di atas:
if (state->textInputState) {
GameActivity_getTextInputState(
app->activity,
GameTextInputGetStateCB, // App's event handler shown above.
&engine // Context to the GameTextInputGetStateCB function.
);
}
Aplikasi dapat melakukan inisialisasi konten GameTextInputState
secara opsional dengan
GameActivity_setTextInputState()
.
Mendapatkan status TextInput dengan GameTextInput API
Aplikasi juga dapat langsung menggunakan GameTextInput
API untuk mengambil
GameTextInputState
saat ini:
- Gunakan
GameActivity_getTextInput()
untuk mendapatkan instanceGameTextInput
internal GameActivity. - Dengan instance
GameTextInput
yang ada, panggilGameTextInput_getState()
untuk mendapatkan kontenGameTextInputState
yang sama.
Sekali lagi, perhatikan bahwa aplikasi tidak boleh melakukan inisialisasi GameTextInput
secara langsung. GameActivity
sudah melakukannya selama proses inisialisasi.
Mekanisme callback sama dengan yang digunakan oleh fungsi
GameActivity_getTextInputState()
GameActivity.
Referensi
Referensi berikut mungkin dapat membantu developer saat membuat
aplikasi GameActivity
:
- Memulai GameActivity
- Dokumentasi pengguna GameTextInput
- Contoh agdkTunnel
- Dokumentasi referensi Jetpack untuk GameActivity
- Dokumentasi referensi Jetpack untuk GameTextInput
- Kode sumber AGDK
Masukan
GameActivity dan GameTextInput adalah bagian dari library game Jetpack. Untuk masalah dan pertanyaan apa pun, buat bug di Google IssueTracker.