GameTextInput   Android Game Development Kit का हिस्सा है.

GameTextInput लाइब्रेरी का इस्तेमाल करके, टेक्स्ट इनपुट के लिए सॉफ़्ट कीबोर्ड का इस्तेमाल करने वाला फ़ुल-स्क्रीन Android ऐप्लिकेशन लिखना आसान है.

GameTextInput, सॉफ़्ट कीबोर्ड को दिखाने या छिपाने, बदले गए टेक्स्ट को सेट करने या पाने, और टेक्स्ट में बदलाव होने पर सूचनाएं पाने के लिए, आसान एपीआई उपलब्ध कराता है. यह सुविधा, पूरी तरह से काम करने वाले टेक्स्ट एडिटर ऐप्लिकेशन के लिए नहीं है. हालांकि, गेम में आम तौर पर इस्तेमाल होने वाले उदाहरणों के लिए, यह क्षेत्र चुनने और कॉम्पोज़ करने की सुविधा देता है. साथ ही, यह लाइब्रेरी इनपुट के तरीके के संपादक (आईएमई) की बेहतर सुविधाओं के साथ काम करती है. जैसे, वर्तनी जांचने की सुविधा, सुझाव देने की सुविधा, और एक से ज़्यादा बटन दबाकर वर्ण डालने की सुविधा.

अंदरूनी तौर पर, GameTextInput इनपुट टेक्स्ट को (काम की स्थितियों के साथ) इंटरनल बफ़र GameTextInput::currentState_ में इकट्ठा करता है और उसमें होने वाले किसी भी बदलाव की सूचना ऐप्लिकेशन को देता है. इसके बाद, ऐप्लिकेशन अपने रजिस्टर किए गए कॉलबैक फ़ंक्शन में टेक्स्ट प्रोसेसिंग करता है.

उपलब्धता

GameTextInput का इस्तेमाल इन तरीकों से किया जा सकता है:

  • GameActivity के साथ: GameActivity, GameTextInput को इंटिग्रेट करता है. GameActivity का इस्तेमाल करने वाले ऐप्लिकेशन, सिर्फ़ इंटिग्रेट किए गए GameTextInput का इस्तेमाल कर सकते हैं. इस्तेमाल के निर्देशों की पूरी जानकारी, GameActivity पेज पर दी गई है. GameActivity और GameTextInput इंटिग्रेशन का उदाहरण देखने के लिए, games-samples repository देखें. इस गाइड में, इस्तेमाल का यह मॉडल शामिल नहीं है.

  • स्टैंडअलोन लाइब्रेरी के तौर पर: गाइड के बाकी हिस्से में, इस्तेमाल करने के चरणों के बारे में बताया गया है.

ध्यान दें कि ऊपर दिए गए दोनों तरीके, एक-दूसरे के साथ काम नहीं करते.

GameTextInput की आधिकारिक रिलीज़, [Google Maven][google-maven]{:.external} में मौजूद Jetpack गेम्स लाइब्रेरी की रिलीज़ में उपलब्ध हैं.

अपना बिल्ड सेट अप करना

GameTextInput को Android आर्काइव (AAR) के तौर पर डिस्ट्रिब्यूट किया जाता है. इस AAR में Java क्लास और C सोर्स कोड शामिल है, जो GameTextInput की नेटिव सुविधाओं को लागू करता है. आपको Prefab के ज़रिए, इन सोर्स फ़ाइलों को अपनी बिल्ड प्रोसेस के हिस्से के तौर पर शामिल करना होगा. इससे, आपके CMake प्रोजेक्ट या NDK बिल्ड में नेटिव लाइब्रेरी और सोर्स कोड दिखेगा.

  1. अपने गेम की build.gradle फ़ाइल में GameTextInput लाइब्रेरी डिपेंडेंसी जोड़ने के लिए, Jetpack Android Games पेज पर दिए गए निर्देशों का पालन करें. ध्यान दें कि अगर आपके ऐप्लिकेशन, GameActivity का इस्तेमाल कर रहे हैं, तो वे स्टैंडअलोन GameTextInput लाइब्रेरी का इस्तेमाल नहीं कर सकते.

  2. पक्का करें कि gradle.properties में ये लाइनें शामिल हों:

    # 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. game-text-input पैकेज इंपोर्ट करें और उसे अपने प्रोजेक्ट की CMakeLists.txt फ़ाइल में अपने टारगेट में जोड़ें:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. अपने गेम की किसी .cpp फ़ाइल में, GameTextInput को लागू करने के लिए यह लाइन जोड़ें:

    #include <game-text-input/gametextinput.cpp>
    
  5. GameTextInput C API का इस्तेमाल करने वाली सोर्स फ़ाइलों में, हेडर फ़ाइल शामिल करें:

    #include <game-text-input/gametextinput.h>
    
  6. ऐप्लिकेशन को कंपाइल और चलाएं. अगर आपको CMake से जुड़ी गड़बड़ियां मिलती हैं, तो पुष्टि करें कि AAR और build.gradle फ़ाइलें सही तरीके से सेट अप की गई हैं. अगर #include फ़ाइल नहीं मिलती है, तो अपनी CMakeLists.txt कॉन्फ़िगरेशन फ़ाइल की पुष्टि करें.

अपना बिल्ड इंटिग्रेट करना

  1. अपनी C थ्रेड से, जो पहले से ही JVM या ऐप्लिकेशन की मुख्य थ्रेड से जुड़ी है, JNIEnv पॉइंटर के साथ GameTextInput_init को कॉल करें.

    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. InputConnection का ऐक्सेस वाली InputEnabledTextView Java क्लास बनाएं.

    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. बनाए गए InputEnabledTextView को यूज़र इंटरफ़ेस (यूआई) लेआउट में जोड़ें. उदाहरण के लिए, activity_main.xml में दिया गया यह कोड, विज्ञापन को स्क्रीन पर सबसे नीचे दिखा सकता है:

    <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. अपनी Java गतिविधि में इस नई InputEnabledTextView क्लास को वापस लाएं. व्यू बाइंडिंग का इस्तेमाल करने पर, यह काम करना काफ़ी आसान हो जाता है:

    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. अपनी C लाइब्रेरी में, inputConnection को GameTextInput_setInputConnection में पास करें. C स्टेटस स्ट्रक्चर GameTextInputState के तौर पर इवेंट की सूचना पाने के लिए, GameTextInput_setEventCallback में कॉलबैक पास करें.

    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. अपनी C लाइब्रेरी में, GameTextInput_processEvent को कॉल करें. इससे, आपके ऐप्लिकेशन में स्थिति बदलने पर इवेंट मैनेज करने के लिए, पिछले चरण में रजिस्टर किए गए कॉलबैक को अंदरूनी तौर पर कॉल किया जाता है.

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

यूटिलिटी फ़ंक्शन

GameTextInput लाइब्रेरी में ऐसे यूटिलिटी फ़ंक्शन शामिल हैं जिनकी मदद से, Java स्टेटस ऑब्जेक्ट और C स्टेटस स्ट्रक्चर के बीच बदलाव किया जा सकता है. GameTextInput_showIme और GameTextInput_hideIme फ़ंक्शन की मदद से, IME को दिखाने और छिपाने की सुविधा ऐक्सेस करें.

रेफ़रंस

GameTextInput का इस्तेमाल करके ऐप्लिकेशन बनाते समय, डेवलपर को ये चीज़ें काम की लग सकती हैं:

सुझाव/राय दें या शिकायत करें

GameTextInput से जुड़ी किसी भी समस्या और सवाल के लिए, Google IssueTracker पर एक बग बनाएं.