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:

alt_text

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:

Lihat dokumen referensi API untuk mengetahui definisinya. Setelah keyboard ditampilkan, UI aplikasi mungkin terlihat seperti berikut:

alt_text

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:

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:

Masukan

GameActivity dan GameTextInput adalah bagian dari library game Jetpack. Untuk masalah dan pertanyaan apa pun, buat bug di Google IssueTracker.