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 buffer 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 contoh game.

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 buffer 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 buffer 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 buffer 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.