Event Capturing and Event Bubbling – एक और महत्वपूर्ण रूप ये याद रखने वाली बात ये है कि Hardware Key Events यानी Android Device के किसी Hardware Button को Press करने की वजह से Fire होने वाले Events हमेंशा Currently Active Android App के उस View Control को प्राप्त होते हैं जिस पर Focus होता है। ये Events अपनी View Hierarchy के Top से Dispatch होना शुरू होते हैं और तब तक अपनी Hierarchy में Down Side में Dispatch होते रहते हैं, जब तक कि उनका Appropriate Destination नहीं आ जाता।
उदाहरण के लिए यदि हम अपने पिछले Chapter में Discuss किए गए TableLayout Example की Component Tree को ही देखें, तो विभिन्न UI View Controls को Hierarchy को निम्नानुसार देख सकते हैं:
और यदि हम इसकी Component Hierarchy Create करें, तो हमारी Hierarchy कुछ निम्नानुसार तरीके से Represent हो सकती है-
अब यदि Currently इस Layout के btnLogin नाम के Button View पर Focus हो और हम अपने Android Device के Enter Key को Press करके Hardware OnClick Event Fire कर दें, तो ये Event सबसे पहले TableLayout View पर पहुंचता है क्योंकि इस Android App के Layout में TableLayout ही वह Parent या Top Level Container View है, जिसमें अन्य सभी UI View Controls Child की तरह Placed हैं।
इसलिए यदि हम चाहें, तो यद्धपि ये OnClick Event, btnLogin Button के लिए Fire किया गया है, लेकिन फिर भी हम इसे TableLayout Container के लिए Define किए गए Event Listener में Capture करके भी किसी Appropriate Event Handle Callback Method द्वारा Response कर सकते हैं।
इस Event को TableLayout Level पर Handle कर लेने के बावजूद हमारे सामने दो स्थितियां होती हैं। यदि हम चाहें तो इस OnClick Event को TableLayout Level पर Implement करके आगे Proceed होने से रोक भी सकते हैं और ऐसा करने पर btnLogin के लिए Fire होने वाला OnClick Event वास्तव में अपने Destination तक पहुंचेगा ही नहीं क्योंकि उसे TableLayout Level पर ही Handler कर लिया गया होगा।
अथवा यदि हम चाहें तो इस btnLogin के लिए Fire होने वाले OnClick Event को TableLayout Level पर Handle करने के बावजूद उसे अगले Level की Heirarchy द्वारा Handle किए जाने के लिए Forward कर सकते हैं और यदि हम ऐसा करते हैं, तो अब ये OnClick Event, TableLayout के बाद उसकी Component Heirarchy के अगले Level के UI View Control TableRow पर पहुंचता है।
यदि हम चाहें तो इस btnLogin Button के लिए Fire होने वाले इस OnClick Event को TableLayout की तरह ही एक बार फिर से TableRow Level पर भी Handle कर सकते हैं और फिर हमारे सामने दो स्थितियां हो सकती हैं, जहां यदि हम चाहें तो इस OnClick Event को TableRow Level पर Handle करके आगे Proceed होने से रोक सकते हैं या फिर इस Event को TableRow Level पर Handle करके अथवा बिना Handle किए हुए ही अगले Level की Component Hierarchy के UI View Controls द्वारा Handle किए जाने के लिए Forward कर सकते हैं, जिसके परिणामस्वरूप आखिरकार btnLogin Button के लिए Fire होने वाला OnClick Event, btnLogin Button के लिए Setup किए गए Event Handler तक पहुंचता है।
यदि हम हमारे Android Program में कभी भी ये जानना चाहें कि किसी Specific UI View Control द्वारा Fire किया गया Event, विभिन्न Levels की Hierarchy में किस तरह से Dispatch होते हुए अपने अन्तिम Destination तक पहुंचा है, तो इस जरूरत को पूरा करने के लिए Android SDK द्वारा Provide किए जाने वाले dispatchKeyEvent() Method को Use कर सकते हैं।
विभिन्न Modern Event Driven Programming Languages में Events को Handle करने के लिए दो तरीके Use किए जाते हैं क्योंकि Fire होने के बाद Event दो तरीकों से Flow हो कर अपने Event Source Control तक पहुंचता है।
उपरोक्त Discussion में हमने Event के Flow होने के जिस तरीके को समझा, उसे Event Capturing के नाम से जाना जाता है जिसके अन्तर्गत Event Source UI View Control द्वारा किसी Event को Fire करने के बाद वह Event सबसे पहले Layout के विभिन्न GUI Components की Hierarchy में सबसे पहले Top Level View या Outer Most Container View पर पहुंचता है और अन्त में उस Event Source UI Component तक पहुंचता है, जिसने Actually उस Event को Fire किया है।
जबकि Event Flow के दूसरे तरीके को Event Bubbling के नाम से जाना जाता है और इस तरीके के अन्तर्गत Event Source द्वारा किसी Event के Fire होने पर सबसे पहले वह Event अपने Source UI View Control पर पहुंचता है और उसके बाद अपने GUI Layout की Component Heirarchy में Upper Level के UI View Controls पर Bubble होता है या पहुंचता है।
इसलिए यदि हम इस Event Flow तरीके को अपने उपरोक्त Example पर Apply करते हुए समझें, तो यदि btnLogin Button को Click करने पर Event Bubbling के माध्यम से Event Flow होता, तो सबसे पहले btnClick Button के लिए Setup किए गए Event Listener का Callback Method Execute होता, उसके बाद TableRow UI View Control का और अन्त में TableLayout के लिए Setup किए गए Event Listener का Callback Event Handler Method Execute होता।
jQuery और JavaScript जैसी Scripting Languages पर आधारित GUI के अन्तर्गत Event Bubbling होता है, जबकि .Net और Java जैसी Programming Languages पर आधारित GUI के अन्तर्गत Event Capturing होता है।
dispatchKeyEvent() Method के अलावा अपने Views द्वारा Fired Key Events को Capture करने के लिए हम प्रत्येक Fire होने वाले Event को onKeyDown() व onKeyUp() Methods द्वारा अपनी Activity के अन्दर Receive कर सकते हैं और फिर उन्हें अपनी जरूरत के आधार पर Use कर सकते हैं।
इसके अलावा जब हम हमारे Android App में Text Input लेते हैं, तब इस बात को ध्यान रखना जरूरी होता है कि कई Android Devices केवल Software Inupt Method के माध्यम से ही Text Input Accept करते हैं। यदि हम ज्यादातर Modern Mobile Devices को देखें, तो उनमें सामान्यत: केवल 4 Hardware Buttons (On/Off, Volume UP, Volume DOWN, Home) ही होते हैं। इसलिए इस तरह के Devices के लिए Android App Develop करते समय हमें onKeyDown() व onKeyUp() जैसे Methods की जरूरत नहीं होती।
इसके अलावा अब ज्यादातर Modern Android Devices में Voice Input, Handwriting, Video Input जैसे माध्यमों से भी Data Input किया जाने लगा है। इसलिए यद्धपि Android Device पर Keyboard जैसे Interface होते हैं लेकिन सामान्यत: वे onKeyDown() Family के Events Fire ही नहीं करते। इसलिए हमें हमारे Android App में कभी भी ऐसा User Interface नहीं बनाना चाहिए, जो कि किसी Specific Key Press द्वारा Control हो।
हालांकि यदि हमें केवल ऐसा Android App ही Develop करना हो जो कि किसी Hardware Keyboard वाले Devices पर ही Run होना हो, तो उस स्थिति में हम इन Methods को Use करते हुए अपना Android App User Interface Create कर सकते हैं।
लेकिन फिर भी हमें कभी भी इन Methods पर भरोसा करते हुए ऐसा User Interface नहीं बनाना चाहिए, जिसमें Keyboard के Enter Key को Press करने पर Input किए गए Data का Validation किया जा रहा हो। बल्कि हमें हमारे Input Methods को हमेंशा IME_ACTION_DONE, IME_ACTION_GO, IME_ACTION_NEXT, IME_ACTION_PREVIOUS, IME_ACTION_NEXT, IME_ACTION_NONE जैसे Actions का प्रयोग करते हुए इस बात का Signal देना चाहिए कि हमारा Application React करने के लिए किस तरह का Input Expect कर रहा है।
सरलतम शब्दों में कहें तो हमें कभी भी किसी भी User Interface में Hardware Keyboard के लिए Specify किए गए onKeyDown() Family के Methods पर किसी भी तरह के Input Validation के लिए ज्यादा भरोसा नहीं करना चाहिए क्योंकि वर्तमान समय में ज्यादातर Android Devices पर Physical Keyboard नहीं होता और ये Methods, Physical Keyboards द्वारा Input किए गए Data को Validate करने के लिए Develop किए गए थे।
Android Platform हमेंशा सबसे पहले Event Handlers को Call करता है और Appropriate Class Definition के Default Handlers को बाद में Call करता है। जैसे कि इन Event Handler Callbacks से true Return होने पर Event Listeners, Captured Event को अगले Hierarchy Level के UI Controls के Event Listeners पर Propogate होने से रोक देता है View में Defined Default Callback Event Handler को भी Block कर देता है।
इसलिए आप जब भी कभी किसी Callback Method से true Return करें, तो इस बात का हमेंधा ध्यान रखें कि आप Event को पूरी तरह से Terminate कर रहे हैं ताकि एक बार Handle होने के बाद वह Component Level की Hierarchy के किसी भी Level पर दोबारा Capture न हो।
Buy this eBook to Read more about…
- Event Handlers of Custom Components
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Android in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।
Android in Hindi | Page: 628 | Format: PDF