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 mengakumulasi teks input (bersama dengan status yang relevan) ke buffering internal GameTextInput::currentState_ dan memberi tahu aplikasi jika ada perubahan. Aplikasi kemudian melakukan pemrosesan teks dalam fungsi callback terdaftarnya.

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 contoh game. Model penggunaan ini tidak tercakup dalam panduan ini.

  • Sebagai library mandiri: Panduan selengkapnya menjelaskan langkah-langkah penggunaan.

Perhatikan bahwa kedua metode di atas tidak dapat terjadi bersamaan.

Rilis GameTextInput resmi tersedia di saluran berikut:

Panduan ini membahas kasus penggunaan pertama. Untuk menggunakan rilis file ZIP, lihat petunjuk yang dikirimkan 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 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.

  1. Ikuti petunjuk di halaman Game Jetpack Android untuk menambahkan dependensi library GameTextInput ke file build.gradle game Anda. Perlu diketahui bahwa jika aplikasi Anda menggunakan GameActivity, aplikasi tersebut 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 dalam 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. Dalam file sumber yang menggunakan GameTextInput C API, sertakan file header:

    #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 telah terpasang ke JVM, atau thread utama aplikasi, 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 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" />
    
  4. Ambil class InputEnabledTextView baru ini ke aktivitas Java Anda. Hal ini 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. Teruskan callback di GameTextInput_setEventCallback untuk diberi tahu tentang peristiwa sebagai struktur status C 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 library C, panggil GameTextInput_processEvent , yang secara internal memanggil callback yang terdaftar pada 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 fungsi untuk menampilkan dan menyembunyikan IME melalui fungsi GameTextInput_showIme dan GameTextInput_hideIme.

Referensi

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

Masukan

Untuk masalah dan pertanyaan apa pun terkait GameTextInput, buat bug di Google IssueTracker.