Pole do wpisania tekstu gry Zawiera Android Game Development Kit.

Korzystanie z biblioteki GameTextInput prostszą alternatywę dla pełnoekranowych aplikacji na Androida, które wykorzystują klawiatura do wprowadzania tekstu.

GameTextInput udostępnia prosty interfejs API do wyświetlania lub ukrywania funkcji klawiaturę, ustawić lub pobrać aktualnie edytowany tekst oraz otrzymywać powiadomienia, gdy tekst zostanie zmieniony. Nie dotyczy to w pełni funkcjonalnych aplikacji edytorów tekstu, ale nadal zapewnia obsługę wyboru i tworzenia regionu w typowych przypadkach użycia gry. Ta biblioteka obsługuje również zaawansowany edytor metod wprowadzania tekstu (IME), takie jak sprawdzanie pisowni sprawdzanie, uzupełnienia i znaki wieloklawiszowe.

Wewnętrznie funkcja GameTextInput gromadzi tekst wejściowy (wraz z parametrem odpowiednie stany) do bufora wewnętrznego GameTextInput::currentState_ oraz powiadamia o tym i wszelkie wprowadzone w niej zmiany. Następnie aplikacja przetwarza tekst zarejestrowana funkcja wywołania zwrotnego.

Dostępność

Z usługi GameTextInput można korzystać na następujące sposoby:

  • Razem z funkcją GameActivity: GameActivity integruje funkcję GameTextInput. Aplikacje, które używają GameActivity, mogą używać tylko zintegrowanego GameTextInput. Instrukcje użytkowania są w pełni udokumentowane stronie GameActivity . Dla przykładowej integracji GameActivity i GameTextInput, zapoznaj się z games-samples. Ten model wykorzystania to nie są objęte tym przewodnikiem.

  • Jako samodzielna biblioteka: w dalszej części tego przewodnika znajdziesz opis poszczególnych czynności.

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

Formalne wydania GameTextInput są dostępne na tych kanałach:

Ten przewodnik dotyczy pierwszego przypadku użycia. Aby użyć wersji pliku ZIP: zapoznaj się z instrukcjami wysłanymi w pakiecie.

Konfigurowanie kompilacji

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

  1. Postępuj zgodnie z instrukcjami na Jetpack Android Games, aby dodać zależność biblioteki GameTextInput od pliku build.gradle gry. Notatka że aplikacje używające GameActivity, nie mogą używać parametru samodzielną bibliotekę GameTextInput.

  2. Upewnij się, że 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 miejsca docelowego w plik 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ć implementacja GameTextInput:

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

    #include <game-text-input/gametextinput.h>
    
  6. skompilować i uruchomić aplikację; Jeśli występują błędy CMake, zweryfikuj atrybuty AAR i Pliki usługi build.gradle są prawidłowo skonfigurowane. Jeśli plik #include to nie znaleziono. Sprawdź plik konfiguracyjny CMakeLists.txt.

Zintegruj kompilację

  1. Z wątku C, który jest już dołączony do maszyny JVM, lub z głównego wątku aplikacji. thread, wywołaj GameTextInput_init ze 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ę Java InputEnabledTextView 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 element InputEnabledTextView do układu interfejsu. Na przykład parametr ten kod w activity_main.xml może umieścić go na dole argumentu Ekran:

    <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. To jest względnie proste w przypadku użycia funkcji View Binding (Powiązanie 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ż oddzwonienie za GameTextInput_setEventCallback aby otrzymywać powiadomienia o zdarzeniach jako struktura 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 polecenie GameTextInput_processEvent , który wywołuje wewnętrzne wywołanie zwrotne zarejestrowane w poprzednim kroku, dla do obsługi zdarzeń w przypadku zmiany stanu.

    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 użytkowe

Biblioteka GameTextInput zawiera funkcje użytkowe, które umożliwiają konwertowanie między obiektami stanu Java a strukturami stanów C. Dostęp do funkcji wyświetlania i ukrywanie IME za pomocą narzędzia GameTextInput_showIme i GameTextInput_hideIme funkcji.

Pliki referencyjne

Podczas tworzenia aplikacji za pomocą funkcji GameTextInput:

Opinia

W przypadku problemów i pytań dotyczących usługi GameTextInput utwórz błąd w narzędziu Google IssueTracker.