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 dari setiap perubahan di dalamnya. Aplikasi kemudian 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. Petunjuk penggunaan didokumentasikan secara lengkap di halaman GameActivity . Untuk contoh integrasi GameActivity dan GameTextInput, lihat repositori game-samples. Model penggunaan ini tidak termasuk dalam cakupan panduan ini.

  • Sebagai library mandiri: bagian lainnya dalam panduan ini akan menjelaskan langkah-langkah penggunaan.

Perhatikan bahwa kedua metode di atas sama-sama bersifat eksklusif.

Rilis GameTextInput formal tersedia di saluran berikut:

Panduan ini membahas kasus penggunaan pertama. Untuk menggunakan rilis file ZIP, lihat instruksi yang dikirimkan di dalam paket.

Menyiapkan build

GameTextInput didistribusikan sebagai Android Archive (AAR). AAR ini berisi class Java dan kode sumber C, yang mengimplementasikan fitur native GameTextInput. Anda perlu menyertakan file sumber ini sebagai bagian dari proses build Anda melalui Prefab, yang mengekspos library native dan kode sumber ke project CMake atau build NDK.

  1. Ikuti petunjuk di Game Jetpack Android untuk menambahkan Dependensi library GameTextInput ke file build.gradle game Anda. Catatan jika aplikasi Anda menggunakan GameActivity, aplikasi tidak dapat menggunakan library GameTextInput mandiri.

  2. Pastikan gradle.properties berisi 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=true
    
  3. Impor paket game-text-input dan tambahkan ke target Anda di file CMakeLists.txt project:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. Di salah satu file .cpp di game Anda, tambahkan baris berikut untuk menyertakan penerapan GameTextInput:

    #include <game-text-input/gametextinput.cpp>
    
  5. Di file sumber yang menggunakan GameTextInput C API, sertakan header-nya file:

    #include <game-text-input/gametextinput.h>
    
  6. Mengompilasi dan menjalankan aplikasi. Jika Anda memiliki error CMake, verifikasi file AAR dan build.gradle yang telah disiapkan dengan benar. Jika file #include tidak ditemukan, verifikasi file konfigurasi CMakeLists.txt Anda.

Mengintegrasikan build

  1. Dari thread C yang sudah terpasang ke JVM, atau dari bagian utama aplikasi rangkaian pesan, panggil GameTextInput_init dengan pointer JNIEnv.

    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);
        ...
    }
    
  2. Buat class Java InputEnabledTextView dengan akses ke InputConnection.

    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);
    }
    
  3. Tambahkan InputEnabledTextView yang dibuat ke tata letak UI. Misalnya, kode berikut di activity_main.xml dapat menempatkannya 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" />
    
  4. Ambil class InputEnabledTextView baru ini ke aktivitas Java Anda. Ini adalah relatif sederhana saat 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);
      }
    
  5. Di library C, teruskan inputConnection ke GameTextInput_setInputConnection. Meneruskan callback masuk GameTextInput_setEventCallback untuk menerima notifikasi peristiwa sebagai C state struct GameTextInputState.

    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);
    }
    
  6. Di pustaka C Anda, panggil GameTextInput_processEvent , yang secara internal memanggil callback Anda yang terdaftar di langkah sebelumnya, untuk aplikasi Anda untuk 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 GameTextInput_showIme dan GameTextInput_hideIme fungsi-fungsi lainnya.

Referensi

Hal berikut mungkin berguna bagi developer saat membuat aplikasi dengan GameTextInput:

Masukan

Jika ada masalah dan pertanyaan terkait GameTextInput, buat bug di IssueTracker Google.