GameTextInput   Część Android Game Development Kit.

Korzystanie z biblioteki GameTextInput jest prostszą alternatywą dla pisania aplikacji na Androida na pełnym ekranie, która używa klawiatury ekranowej do wprowadzania tekstu.

GameTextInput udostępnia prosty interfejs API do wyświetlania lub ukrywania klawiatury ekranowej, ustawiania lub pobierania aktualnie edytowanego tekstu oraz otrzymywania powiadomień o zmianach w tekście. Nie jest to pełnoprawna aplikacja do edycji tekstu, ale zapewnia obsługę regionu wyboru i komponowania w typowych przypadkach użycia w grach. Ta biblioteka obsługuje też zaawansowane funkcje edytora metody wprowadzania (IME), takie jak sprawdzanie pisowni, uzupełnianie i znaki wieloklawiszowe.

Wewnętrznie funkcja GameTextInput gromadzi tekst wejściowy (wraz z odpowiednimi stanami) w buforze wewnętrznym GameTextInput::currentState_ i powiadamia aplikację o wszelkich zmianach w nim. Aplikacja przetwarza tekst w zarejestrowanej funkcji wywołania zwrotnego.

Dostępność

GameTextInput można używać w ten sposób:

  • Wraz z GameActivity: GameActivity integruje GameTextInput. Aplikacje korzystające z GameActivity mogą używać tylko zintegrowanego interfejsu GameTextInput. Instrukcje użytkowania są w pełni udokumentowane na stronie GameActivity . Przykłady integracji GameActivity i GameTextInput znajdziesz w repozytorium games-samples. Ten model użycia nie jest objęty zakresem tego przewodnika.

  • Jako samodzielna biblioteka: pozostała część przewodnika zawiera opis kroków użycia.

Pamiętaj, że te 2 metody wzajemnie się wykluczają.

Oficjalne wersje GameTextInput są dostępne w bibliotece gier Jetpack w [Google Maven][google-maven]{:.external}.

Konfigurowanie kompilacji

GameTextInput jest rozpowszechniany jako archiwum Androida (AAR). Ten plik AAR zawiera klasy Java i kod źródłowy w języku C, który implementuje funkcje natywne GameTextInput. Musisz uwzględnić te pliki źródłowe w procesie kompilacji za pomocą Prefab, które udostępnia biblioteki natywne i kod źródłowy w projekcie CMake lub kompilacji NDK.

  1. Postępuj zgodnie z instrukcjami na stronie Jetpack Android Games, aby dodać zależność biblioteki GameTextInput do pliku build.gradle gry. Pamiętaj, że jeśli Twoje aplikacje korzystają z GameActivity, nie mogą używać samodzielnej biblioteki GameTextInput.

  2. Upewnij się, że plik gradle.properties zawiera te wiersze:

    # 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. Zaimportuj pakiet game-text-input i dodaj go do celu w pliku CMakeLists.txt projektu:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. W jednym z plików .cpp w grze dodaj ten wiersz, aby uwzględnić implementację GameTextInput:

    #include <game-text-input/gametextinput.cpp>
    
  5. W plikach źródłowych, które korzystają z interfejsu API C GameTextInput, uwzględnij plik nagłówkowy:

    #include <game-text-input/gametextinput.h>
    
  6. Skompiluj i uruchom aplikację. Jeśli wystąpią błędy CMake, sprawdź, czy pliki AAR i build.gradle są prawidłowo skonfigurowane. Jeśli plik #include nie zostanie znaleziony, sprawdź plik konfiguracji CMakeLists.txt.

Integracja kompilacji

  1. Z wątku C, który jest już dołączony do JVM, lub z głównego wątku aplikacji wywołaj funkcję GameTextInput_init z wskaźnikiem 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. Utwórz klasę InputEnabledTextView Java z dostępem do 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. Dodaj utworzony InputEnabledTextView do układu interfejsu. Na przykład ten kod w activity_main.xml może umieścić go u dołu ekranu:

    <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. Pobierz tę nową klasę InputEnabledTextView do aktywności w Javie. Jest to stosunkowo proste, gdy używasz powiązania widoków:

    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. W bibliotece C przekaż inputConnection do GameTextInput_setInputConnection. Przekaż wywołanie zwrotne w GameTextInput_setEventCallback, aby otrzymywać powiadomienia o zdarzeniach w postaci struktury stanu 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. W bibliotece C wywołaj funkcję GameTextInput_processEvent, która wewnętrznie wywołuje zarejestrowaną w poprzednim kroku funkcję zwrotną, aby aplikacja mogła obsługiwać zdarzenia, gdy stan się zmieni.

    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);
    }
    

Funkcje narzędziowe

Biblioteka GameTextInput zawiera funkcje narzędziowe, które umożliwiają konwertowanie obiektów stanu Java na struktury stanu C i odwrotnie. Dostęp do funkcji wyświetlania i ukrywania IME za pomocą funkcji GameTextInput_showImeGameTextInput_hideIme.

Pliki referencyjne

Podczas tworzenia aplikacji z użyciem działania GameTextInput deweloperom mogą się przydać te informacje:

Opinia

W przypadku problemów i pytań dotyczących GameTextInput utwórz zgłoszenie błędu w Google IssueTracker.