इनपुट इवेंट की खास जानकारी

लिखने का तरीका आज़माएं
Android के लिए, Jetpack Compose हमारा सुझाया गया यूज़र इंटरफ़ेस (यूआई) टूलकिट है. Compose में टच और इनपुट इस्तेमाल करने का तरीका जानें.

Android पर, आपके ऐप्लिकेशन के साथ उपयोगकर्ता के इंटरैक्शन से इवेंट को रोकने के एक से ज़्यादा तरीके हैं. अपने यूज़र इंटरफ़ेस में इवेंट इकट्ठा करते समय, इन इवेंट को कैप्चर किया जाता है वह व्यू ऑब्जेक्ट जिससे उपयोगकर्ता इंटरैक्ट करता है. ऐसा करने के लिए, व्यू क्लास की मदद ली जा सकती है.

अपना लेआउट बनाने के लिए इस्तेमाल की जाने वाली अलग-अलग व्यू क्लास में, आपको कई सार्वजनिक कॉलबैक दिख सकते हैं ऐसे मेथड जो यूज़र इंटरफ़ेस (यूआई) इवेंट के लिए काम के लगते हैं. इन तरीकों को Android फ़्रेमवर्क तब कॉल करता है, जब उस ऑब्जेक्ट पर संबंधित कार्रवाई होती है. उदाहरण के लिए, जब किसी व्यू (जैसे कि बटन) को टच किया जाता है, उस ऑब्जेक्ट पर onTouchEvent() तरीके को कॉल किया जाता है. हालांकि, इसे रोकने के लिए, आपको क्लास में बदलाव करें और विधि को ओवरराइड करें. हालांकि, हर View ऑब्जेक्ट को बढ़ाना यह संभव नहीं है. इसलिए, व्यू क्लास में यह भी शामिल होता है यह कॉलबैक के साथ नेस्ट किए गए इंटरफ़ेस का एक कलेक्शन है, जिसे आसानी से तय किया जा सकता है. ये इंटरफ़ेस, इवेंट लिसनर, आपके यूज़र इंटरफ़ेस (यूआई) से उपयोगकर्ता इंटरैक्शन कैप्चर करने का टिकट होता है.

उपयोगकर्ता इंटरैक्शन को सुनने के लिए आम तौर पर, इवेंट लिसनर का इस्तेमाल किया जाता है. हालांकि, आपके लिए एक समय आया, जब आपको कस्टम कॉम्पोनेंट बनाने के लिए व्यू क्लास को बढ़ाना होगा. Button की अवधि को बढ़ाया जा सकता है ताकि कुछ और आकर्षक बनाया जा सके. इस मामले में, अपने लिए डिफ़ॉल्ट इवेंट व्यवहार को परिभाषित किया जा सकता है क्लास इवेंट हैंडलर का इस्तेमाल करके.

इवेंट लिसनर

इवेंट लिसनर, View क्लास का एक इंटरफ़ेस है जिसमें एक कॉलबैक का तरीका. इन तरीकों को Android फ़्रेमवर्क तब कॉल करेगा, जब सुनने वाले के व्यू में रजिस्टर किया गया, यूज़र इंटरफ़ेस (यूआई) में मौजूद आइटम के साथ उपयोगकर्ता के इंटरैक्शन से ट्रिगर होता है.

इवेंट लिसनर इंटरफ़ेस में, इन कॉलबैक के तरीके शामिल होते हैं:

onClick()
View.OnClickListener से. यह तब कॉल होता है, जब उपयोगकर्ता किसी आइटम को छूता है (टच मोड में होने पर) या नेविगेशन-कुंजियों या ट्रैकबॉल का इस्तेमाल करके आइटम पर फ़ोकस करता है और सही "enter" दबाता है बटन या ट्रैकबॉल को दबाता है.
onLongClick()
View.OnLongClickListener से. इसे तब कॉल किया जाता है, जब उपयोगकर्ता या तो आइटम को दबाकर रखता है (टच मोड में होता है) या नेविगेशन-बटन या ट्रैकबॉल की मदद से आइटम पर फ़ोकस करता है और सही "enter" को दबाकर रखता है ट्रैकबॉल पर बटन को दबाकर रखता है या दबाकर रखता है (एक सेकंड के लिए).
onFocusChange()
View.OnFocusChangeListener से. इसे तब कॉल किया जाता है, जब उपयोगकर्ता नेविगेशन-की या ट्रैकबॉल का इस्तेमाल करके, आइटम पर या उससे दूर जाता है.
onKey()
View.OnKeyListener से. इसे तब कॉल किया जाता है, जब उपयोगकर्ता किसी आइटम पर फ़ोकस करता है और डिवाइस पर हार्डवेयर कुंजी को दबाता है या उसे छोड़ देता है.
onTouch()
View.OnTouchListener से. इसे तब कॉल किया जाता है, जब उपयोगकर्ता कोई ऐसी कार्रवाई करता है जो टच इवेंट के तौर पर क्वालिफ़ाइड है. इसमें प्रेस, रिलीज़, या स्क्रीन पर (आइटम की सीमाओं के अंदर) कोई भी हलचल करने का जेस्चर.
onCreateContextMenu()
View.OnCreateContextMenuListener से. इसे तब कहा जाता है, जब संदर्भ मेन्यू बनाया जा रहा हो (लगातार "लॉन्ग क्लिक" करने की वजह से). चर्चा देखें मेन्यू में संदर्भ मेन्यू पर डेवलपर गाइड देखें.

ये तरीके ही अपने-अपने इंटरफ़ेस में शामिल होते हैं. इनमें से कोई एक तरीका तय करने के लिए और अपने इवेंट मैनेज करें, अपनी ऐक्टिविटी में नेस्ट किया हुआ इंटरफ़ेस लागू करें या उसे किसी अनजान क्लास के तौर पर तय करें. इसके बाद, लागू करने का कोई इंस्टेंस पास करें View.set...Listener() तरीके से. (जैसे, कॉल setOnClickListener() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है और इसे OnClickListener लागू करने की प्रोसेस पास करें.)

नीचे दिए गए उदाहरण में, किसी बटन के लिए ऑन-क्लिक लिसनर को रजिस्टर करने का तरीका बताया गया है.

Kotlin

protected void onCreate(savedValues: Bundle) {
    ...
    val button: Button = findViewById(R.id.corky)
    // Register the onClick listener with the implementation above
    button.setOnClickListener { view ->
        // do something when the button is clicked
    }
    ...
}

Java

// Create an anonymous implementation of OnClickListener
private OnClickListener corkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(corkyListener);
    ...
}

आपको अपनी गतिविधि के हिस्से के तौर पर OnClickListener को लागू करना भी ज़्यादा आसान लग सकता है. इससे, क्लास का अतिरिक्त लोड और ऑब्जेक्ट असाइन नहीं होंगे. उदाहरण के लिए:

Kotlin

class ExampleActivity : Activity(), OnClickListener {
  
    protected fun onCreate(savedValues: Bundle) {
        val button: Button = findViewById(R.id.corky)
        button.setOnClickListener(this)
    }

    // Implement the OnClickListener callback
    fun onClick(v: View) {
        // do something when the button is clicked
    }
}

Java

public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
        Button button = (Button)findViewById(R.id.corky);
        button.setOnClickListener(this);
    }

    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
    ...
}

ध्यान दें कि ऊपर दिए गए उदाहरण में, onClick() कॉलबैक में कोई रिटर्न वैल्यू नहीं है, लेकिन इवेंट लिसनर के कुछ अन्य तरीकों से बूलियन वैल्यू मिलना चाहिए. वजह इवेंट पर निर्भर करता है. जो लोग ऐसा करते हैं उनके लिए यहां इसकी वजह दी गई है:

  • onLongClick() से इससे यह पता चलता है कि आपने इवेंट का इस्तेमाल किया है या नहीं. साथ ही, इवेंट को आगे नहीं ले जाना चाहिए. इसका मतलब है कि true रिटर्न करके पता लगाएं कि आपने इवेंट को मैनेज किया है और इसे यहां बंद होना चाहिए; अगर आपने इसे मैनेज नहीं किया है और/या इवेंट किसी दूसरे प्लैटफ़ॉर्म पर जारी रहना चाहिए, तो false दिखाएं ऑन-क्लिक लिसनर.
  • onKey() से इससे यह पता चलता है कि आपने इवेंट का इस्तेमाल किया है या नहीं. साथ ही, इवेंट को आगे नहीं ले जाना चाहिए. इसका मतलब है कि true रिटर्न करके पता लगाएं कि आपने इवेंट को मैनेज किया है और इसे यहां बंद होना चाहिए; अगर आपने इसे मैनेज नहीं किया है और/या इवेंट किसी दूसरे प्लैटफ़ॉर्म पर जारी रहना चाहिए, तो false दिखाएं खास आपके लिए उपलब्ध है.
  • onTouch() से इससे यह पता चलता है कि आपका लिसनर इस इवेंट का इस्तेमाल करता है या नहीं. सबसे ज़रूरी बात यह है कि इस इवेंट में एक-दूसरे के बाद होने वाली कई कार्रवाइयाँ हो सकती हैं. इसलिए, अगर आप false पर वापस लौटते हैं, डाउन ऐक्शन इवेंट मिल गया है, तो आपने बताया है कि आपने इवेंट में हिस्सा नहीं लिया है और इस इवेंट की बाद की कार्रवाइयों में दिलचस्पी नहीं है. इसलिए, आपको किसी भी अन्य काम के लिए कॉल नहीं किया जाएगा इवेंट के दौरान, जैसे कि उंगली से दिखाया जाने वाला हाथ का जेस्चर या किसी खास रूटीन से जुड़ी कार्रवाई को पूरा करना.

याद रखें कि हार्डवेयर के मुख्य इवेंट, हमेशा फ़ोकस में मौजूद व्यू में ही डिलीवर किए जाते हैं. उन्हें ऊपर से भेजा जाता है और फिर नीचे, जब तक वे सही डेस्टिनेशन पर नहीं पहुंच जाते. अगर आपका व्यू (या आपके व्यू का चाइल्ड) अभी फ़ोकस मौजूद है, तो फिर आप dispatchKeyEvent() तरीके से इवेंट के सफ़र की जानकारी देख सकते हैं. अपने व्यू से मुख्य इवेंट कैप्चर करने के विकल्प के तौर पर, आपको onKeyDown() के साथ आपकी ऐक्टिविटी में मौजूद सभी इवेंट और onKeyUp().

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

ध्यान दें: Android पहले इवेंट हैंडलर को कॉल करेगा और उसके बाद, उचित डिफ़ॉल्ट सेटिंग को कॉल करेगा दूसरे हैंडलर में क्लास डेफ़िनिशन का इस्तेमाल कर रहे हैं. इसलिए, इन इवेंट लिसनर से true रिटर्न रुक जाएगा इवेंट को दूसरे इवेंट लिसनर के लिए प्रोसेस किया जाएगा. साथ ही, कॉलबैक को ब्लॉक कर दिया जाएगा डिफ़ॉल्ट इवेंट हैंडलर है. इसलिए, यह पक्का कर लें कि जब आपका जवाब true हो, तब इवेंट को खत्म करना हो.

इवेंट हैंडलर

अगर व्यू से कोई कस्टम कॉम्पोनेंट बनाया जा रहा है, तो कॉलबैक के कई तरीके तय किए जा सकते हैं का इस्तेमाल डिफ़ॉल्ट इवेंट हैंडलर के तौर पर किया जाता है. कस्टम जानकारी के बारे में दस्तावेज़ में कॉम्पोनेंट देखें, तो आपको इवेंट मैनेज करने में इस्तेमाल होने वाले कुछ सामान्य कॉलबैक के बारे में पता चलेगा, शामिल हैं:

  • onKeyDown(int, KeyEvent) - किसी नए मुख्य इवेंट के होने पर कॉल किया जाता है.
  • onKeyUp(int, KeyEvent) - मुख्य इवेंट के होने पर कॉल किया जाता है.
  • onTrackballEvent(MotionEvent) - ट्रैकबॉल मोशन इवेंट होने पर कॉल किया जाता है.
  • onTouchEvent(MotionEvent) - टचस्क्रीन में कोई हलचल होने पर कॉल किया जाता है.
  • onFocusChanged(boolean, int, Rect) - यह तब कॉल किया जाता है, जब व्यू का फ़ोकस बढ़ता है या टूट जाता है.

यहां कुछ ऐसे तरीके हैं जिनकी आपको जानकारी होनी चाहिए. ये तरीके व्यू क्लास का हिस्सा नहीं हैं, लेकिन, इवेंट को मैनेज करने के तरीके पर इसका सीधा असर पड़ सकता है. इसलिए, ज़्यादा मुश्किल इवेंट को मैनेज करते समय तो इन अन्य तरीकों का इस्तेमाल करें:

टच मोड

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

टच की सुविधा वाले डिवाइस के लिए, जब उपयोगकर्ता स्क्रीन को छूता है, तब डिवाइस टच मोड में चला जाएगा. इसके बाद से, सिर्फ़ वे व्यू जिनके लिए isFocusableInTouchMode() 'सही है' पर फ़ोकस करने पर फ़ोकस किया जा सकता है, जैसे कि टेक्स्ट में बदलाव करने वाले विजेट. अन्य दृश्य जो स्पर्श किए जा सकते हैं, जैसे बटन, स्पर्श करने पर फ़ोकस नहीं करेंगे; तो वे दबाए जाने पर अपने ऑन-क्लिक लिसनर को सक्रिय कर देते हैं.

जब भी कोई उपयोगकर्ता दिशा बताने वाले बटन पर क्लिक करता है या ट्रैकबॉल से स्क्रोल करता है, तब डिवाइस टच मोड से बाहर निकलें और फ़ोकस करने के लिए व्यू ढूंढें. अब उपयोगकर्ता इंटरैक्ट करना फिर से शुरू कर सकता है उसके यूज़र इंटरफ़ेस के साथ काम करता है.

टच मोड की स्थिति को पूरे सिस्टम (सभी विंडो और गतिविधियों) में बनाए रखा जाता है. मौजूदा स्थिति के बारे में क्वेरी करने के लिए, कॉल करें यह देखने के लिए isInTouchMode() कि डिवाइस फ़िलहाल टच मोड में है या नहीं.

फ़ोकस हैंडलिंग

उपयोगकर्ता के इनपुट के जवाब में, यह फ़्रेमवर्क एक नियमित फ़ोकस मूवमेंट को हैंडल करेगा. इसमें व्यू हटाए जाने, छिपाए जाने या नए व्यू के तौर पर फ़ोकस में बदलाव करना शामिल है व्यू उपलब्ध हो जाएंगे. व्यू से पता चलता है कि वे फ़ोकस करना चाहते हैं isFocusable() तरीके से. यह बदलने के लिए कि कोई दृश्य ले सकता है या नहीं फ़ोकस करो, setFocusable() पर कॉल करो. टच मोड में होने पर, यह पूछा जा सकता है कि व्यू, isFocusableInTouchMode() पर फ़ोकस करने की अनुमति देता है या नहीं. setFocusableInTouchMode() की मदद से, इसे बदला जा सकता है.

Android 9 (एपीआई लेवल 28) या इसके बाद के वर्शन वाले डिवाइसों पर, ऐक्टिविटी शुरुआती फ़ोकस. इसके बजाय, अगर ज़रूरी हो, तो आपको शुरुआती फ़ोकस के लिए साफ़ तौर पर अनुरोध करना होगा.

फ़ोकस हलचल एक एल्गोरिदम पर आधारित होती है, जो दिया जाता है. बहुत कम मामलों में, डिफ़ॉल्ट एल्गोरिदम शायद तय किए गए व्यवहार के बारे में बताएं. इन स्थितियों में, आपके पास ये चीज़ें उपलब्ध कराने का विकल्प होता है लेआउट फ़ाइल में इन एक्सएमएल एट्रिब्यूट को साफ़ तौर पर बदल देता है: nextFocusDown, nextFocusLeft, nextFocusRight, और nextFocusUp. इनमें से किसी एक एट्रिब्यूट को व्यू में जोड़ें जिससे ध्यान छोड़ना होता है. एट्रिब्यूट की वैल्यू को व्यू का आईडी बनाने के लिए तय करें किस तरह का काम किया जा सकता है. उदाहरण के लिए:

<LinearLayout
    android:orientation="vertical"
    ... >
  <Button android:id="@+id/top"
          android:nextFocusUp="@+id/bottom"
          ... />
  <Button android:id="@+id/bottom"
          android:nextFocusDown="@+id/top"
          ... />
</LinearLayout>

आम तौर पर, इस वर्टिकल लेआउट में पहले बटन से ऊपर की ओर नेविगेट करने पर, न ही दूसरे बटन से नीचे की ओर नेविगेट करेगा. अब जबकि सबसे ऊपर वाले बटन पर नीचे वाले से nextFocusUp (और इसके विपरीत) परिभाषित करने पर, नेविगेशन फ़ोकस ऊपर-से-नीचे और नीचे-से-ऊपर तक.

अगर आपको अपने यूज़र इंटरफ़ेस (यूआई) में किसी व्यू को फ़ोकस करने लायक के तौर पर एलान करना हो (जब आम तौर पर ऐसा नहीं होता), अपने लेआउट के एलान में, व्यू में android:focusable एक्सएमएल एट्रिब्यूट जोड़ें. वैल्यू true सेट करें. आपके पास व्यू का एलान करने का भी विकल्प है android:focusableInTouchMode के साथ टच मोड में होने पर फ़ोकस करने लायक.

किसी विशेष दृश्य पर फ़ोकस करने का अनुरोध करने के लिए, requestFocus() को कॉल करें.

फ़ोकस इवेंट सुनने के लिए (किसी व्यू के फ़ोकस पाने या बंद करने पर सूचना पाएं), इसका इस्तेमाल करें onFocusChange(), जैसा कि इवेंट लिसनर सेक्शन में बताया गया है.