GameActivity में TextInput   Android Game Development Kit का हिस्सा है.

GameActivity, GameTextInput को इन तरीकों से इंटिग्रेट करता है:

  • रैपर उपलब्ध कराना
  • नए टेक्स्ट इनपुट इवेंट की उपलब्धता के लिए फ़्लैग बनाना
  • टेक्स्ट कॉन्टेंट के लिए, GameTextInput के स्टेट बफ़र का सीधे तौर पर इस्तेमाल करना

यहां दिए गए डायग्राम में दिखाया गया है कि ऐप्लिकेशन, उपयोगकर्ता से टेक्स्ट इनपुट लेने के लिए अलग-अलग इंटरनल लॉजिकल कॉम्पोनेंट का इस्तेमाल करते हैं:

alt_text

पहले से मौजूद GameTextInput लाइब्रेरी का इस्तेमाल करने के लिए, ये तीन मुख्य चरण हैं:

  • यूज़र इंटरफ़ेस (यूआई) पर सॉफ़्ट कीबोर्ड को कंट्रोल करना
  • नया टेक्स्ट उपलब्ध होने पर सूचना पाना
  • उपयोगकर्ता के डाले गए टेक्स्ट और उसकी स्थितियों को वापस पाना

इस दस्तावेज़ के बाकी हिस्सों में, इनके बारे में ज़्यादा जानकारी दी गई है. GameActivity के साथ GameTextInput के इस्तेमाल का उदाहरण देखने के लिए, games-samples repository देखें.

यूज़र इंटरफ़ेस (यूआई) पर सॉफ़्ट कीबोर्ड को कंट्रोल करना

GameActivity, यूज़र इंटरफ़ेस (यूआई) पर सॉफ़्ट कीबोर्ड को कंट्रोल करने के लिए दो फ़ंक्शन उपलब्ध कराता है:

इनकी परिभाषाओं के लिए, एपीआई के रेफ़रंस दस्तावेज़ देखें. कीबोर्ड दिखने के बाद, ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) कुछ ऐसा दिख सकता है:

alt_text

देखें कि टेक्स्ट उपलब्ध है या नहीं

सॉफ़्ट कीबोर्ड इवेंट, JNI के ज़रिए Java से C/C++ में पास किए जाते हैं. इसके बाद, ये GameActivity के रैपर तक पहुंचते हैं. आखिर में, ये native_app_glue में लागू किए गए android_app::textInputState फ़्लैग में दिखते हैं.GameTextInput ऐप्लिकेशन को इस फ़्लैग को समय-समय पर पोल करना चाहिए, ताकि ज़रूरी प्रोसेसिंग की जा सके:

  • GameActivity सिर्फ़ android_app::textInputState फ़्लैग सेट करता है.
  • ऐप्लिकेशन, फ़्लैग को पोल करते हैं और नए GameTextInput इवेंट को हैंडल करते हैं. जैसे, इनपुट बफ़र में जोड़ा गया नया टेक्स्ट.
  • ऐप्लिकेशन android_app::textInputState को मिटा देते हैं.

ध्यान दें कि android_app::textInputState, सिंगल और मल्टीपल टेक्स्ट इनपुट इवेंट के बीच अंतर नहीं करता है.

एक सामान्य उदाहरण के लिए, यहां दिया गया कोड ऐप्लिकेशन साइकल कमांड, टच इवेंट, और मुख्य इवेंट को हैंडल करने के बाद, textInputState फ़्लैग को पोल करता है:

while (true) {
   // Read all pending events.
   int events;
   struct android_poll_source* source;

   while ((ALooper_pollOnce(engine.animating ? 0 : -1, nullptr, &events,
                                 (void**)&source)) >= 0) {
       // Process this event, etc.
       ...
       // Check if we are exiting.
       if (app->destroyRequested != 0) {
           engine_term_display(&engine);
           return;
       }
   }
   engine_handle_input(app);

   // Process text input events if there is any outstanding.
   if (app->textInputState) {
       // process TextInput events.
          ...
       //reset the textInputState flag
       app->textInputState = 0;
   }
   if (engine.animating) {
         // draw frames.
   }
}

उपयोगकर्ता के इनपुट किए गए टेक्स्ट को वापस पाना

इनपुट किए गए टेक्स्ट और अन्य स्थितियां, GameTextInput के इंटरनल बफ़र GameTextInput::currentState_ में सेव होती हैं. ऐप्लिकेशन, अपना कॉन्टेंट वापस पाने के लिए इनमें से किसी एक तरीके का इस्तेमाल कर सकते हैं:

  • GameActivity का रैपर एपीआई (सुझाया गया)
  • GameTextInput API

GameActivity API की मदद से, TextInput की स्थिति पाना

ऐप्लिकेशन, सामान्य कॉलबैक मैकेनिज़्म की मदद से मौजूदा टेक्स्ट इनपुट हासिल करते हैं:

  • टेक्स्ट इनपुट इवेंट को प्रोसेस करने के लिए, GameTextInputGetStateCallback टाइप का कॉलबैक फ़ंक्शन लागू करें.
  • जब एक या एक से ज़्यादा इवेंट पूरे नहीं हुए हों, तब GameActivity_getInputState() पर कॉल करें.
  • इवेंट प्रोसेस होने के बाद, android_app::textInputState को मिटा दें.

पिछले सेक्शन में दिए गए स्निपेट का इस्तेमाल करके, यहां दिया गया कोड टेक्स्ट इनपुट बफ़र का रेफ़रंस हासिल करता है, उसे प्रोसेस करता है (दिखाया नहीं गया है), और इवेंट फ़्लैग को रीसेट करता है:

extern "C" void GameTextInputGetStateCB(void *ctx, const struct GameTextInputState *state) {
    auto* engine = (struct engine*)ctx;
    if (!engine || !state) return;

    // Process the text event(s).
    LOGI("UserInputText: %s", state->text_UTF8);

    // Clear the text input flag.
    engine->app->textInputState = 0;
}

पिछले सेक्शन में दिखाए गए गेम लूप में, ऊपर दिए गए टेक्स्ट इनपुट हैंडलर का इस्तेमाल करके टेक्स्ट की जांच करें और उसे प्रोसेस करें:

if (state->textInputState) {
    GameActivity_getTextInputState(
        app->activity,
        GameTextInputGetStateCB,  // App's event handler shown above.
        &engine // Context to the GameTextInputGetStateCB function.
    );
}

ऐप्लिकेशन, GameActivity_setTextInputState() का इस्तेमाल करके, GameTextInputState कॉन्टेंट को शुरू कर सकते हैं. हालांकि, ऐसा करना ज़रूरी नहीं है.

GameTextInput API की मदद से, TextInput की स्थिति पाना

ऐप्लिकेशन, मौजूदा GameTextInputState को पाने के लिए सीधे GameTextInput API का इस्तेमाल भी कर सकते हैं:

  • GameActivity का इंटरनल GameTextInput इंस्टेंस पाने के लिए, GameActivity_getTextInput() का इस्तेमाल करें.
  • GameTextInput इंस्टेंस का इस्तेमाल करके, GameTextInput_getState() को कॉल करें, ताकि आपको वही GameTextInputState कॉन्टेंट मिल सके.

फिर से ध्यान दें कि ऐप्लिकेशन को GameTextInput को सीधे तौर पर शुरू नहीं करना चाहिए; GameActivity पहले से ही शुरू होने की प्रोसेस के दौरान ऐसा करता है.

कॉलबैक का तरीका, GameActivity के GameActivity_getTextInputState() फ़ंक्शन के लिए इस्तेमाल किए गए तरीके जैसा ही होता है.

रेफ़रंस

GameActivity ऐप्लिकेशन बनाते समय, डेवलपर को इन संसाधनों से मदद मिल सकती है:

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

GameActivity और GameTextInput, दोनों Jetpack games library का हिस्सा हैं. किसी भी समस्या या सवाल के लिए, Google IssueTracker पर गड़बड़ी की जानकारी दें.