Touch Mode and Focus Handling in Android

Touch Mode and Focus Handling – जब User अपने किसी ऐसे Android Device के माध्‍यम से किसी Appl Layout के User Interface को Hardware Keyboard की Directional Keys अथवा Trackball द्वारा Navigate कर रहा होता है, तब ये जरूरी होता है कि Actionable Items जैसे कि Button पर Focus हो ताकि User इस बात को समझ सके कि Layout का कौनसा UI View Control, Input Accept कर सकता है और कौनसा नहीं।

यदि उस Android Device में Touch Capablities भी हों, और User अपने Touch Screen के माध्‍यम से User Interface के साथ Interact करने लगे, तो उस स्थिति में Actionable Items पर Focus को Set करके उसे Highlight करना जरूरी नहीं रह जाता और उस स्थिति में केवल वे ही Views Focusable रह जाते हैं जिनके लिए isFocusableInTouchMode() को true Set किया गया होता है। जबकि Buttons जैसे अन्‍य Views जो कि Touchable होते हैं, को जब Touch किया जाता है, तब वे कोई Focus नहीं लेते बल्कि Touch करते ही तुरन्‍त अपने OnClick Callback को Fire कर देते हैं।

जितनी बार भी User किसी Directional Key को Hit करता है अथवा Trackball द्वारा Scroll करता है, तो Device तुरन्‍त Touch Mode से Exit हो जाता है और Focus लेने के लिए View को Find करने लगता है। परिणामस्‍वरूप अब User बिना Screen को Touch किए हुए फिर से Interface के साथ Interact करना शुरू कर सकता है।  जिस पर कि Focus भ्‍ मारी Activity के अन्‍तर्गत Fire होने वाले सभी Touch Events को Activity के Window तक Dispatch होने से पहले ही Intercept करने की सुविधा देता है।

Touch Mode State को Entire System यानी प्रत्‍येक Activity व प्रत्‍येक Window द्वारा Maintan किया जाता है। इसलिए Currently Android Device किस Mode में है, इस बात का पता लगाने के लिए Android SDK हमें isInTouchMode() नाम का Method Provide करता है जिसके माध्‍यम से हम इस बात का पता लगा सकते हैं कि हमारा Android Device, Currently Touch Mode में है या नहीं।

Android System, User Input के Response में Layout के विभिन्‍न UI View Controls पर Focus को Movement करने का Routine Task स्‍वयं अपने स्‍तर पर Internally Automatically Handle करता रहता है, जिसके लिए हमें अलग से कोई Code नहीं लिखना पड़ता। यानी जब किसी View को Backend Java Code द्वारा Programmatically Hide या Remove किया जाता है अथवा जब कोई नया View Available या Visible करवाया जाता है, तब Focus स्‍वयं ही Appropriate View पर Change या Move हो जाता है जिसके लिए कोई Code नहीं लिखना पड़ता न ही Android System को कोई Instruction देना होता है।

इसके अलावा कोई UI View Control Focus Accept करने योग्‍य है या नहीं, इस बात का पता isFocusable() Method द्वारा आसानी से लगाया जा सकता है। साथ ही setFocusable() Method के माध्‍यम से हम ये भी तय कर सकते हैं कि कोई UI View Control, Focus Accept कर सकेगा या नहीं।

इसी तरह से जब Device Touch Mode में होता है, तब हम isFocusableInTouchMode() Method के माध्‍यम से इस बात का पता लगा सकते हैं कि कोई Specific View, Focus को Allow करता है या नहीं जबकि किसी UI View को Focus Allow करना चाहिए या नहीं, इस बात को तय करने के लिए हम setFocusableInToucMode() Method को Use कर सकते हैं।

Android Platform के अन्‍तर्गत Focus Movement एक Algorithm पर आधारित होता है जो किसी Specify किए गए Direction में स्थित सबसे नजदीकी Neighbor UI View को Find करता है और बहुत ही Rare स्थिति में ऐसा होता है कि ये Algorithm अपने Default Behavior को Match न करें यानी Focus को सही UI View Control पर Move न करे।

ऐसी Rare Case Situation को Handle करने के लिए भी Android SDK हमें nextFocusDown, nextFocusLeft, nextFocusRightnextFocusUp नाम के XML Attributes Provide करता है जिनके माध्‍यम ये हम Focus Movement के Default Behaviour को Override करते हुए किसी Specific UI View Control पर Move कर सकते हैं। इन Attributes की Working को समझने के लिए हम निम्‍नानुसार एक Simple सा Focus Movement App Create कर सकते हैं, जिस पर Top, Right, Bottom, LeftCenter नाम के पांच Buttons हैं और अपने नाम के अनुसार ही ये पांचों Top, Right, Bottom, LeftCenter में Positioned हैं।

File Name:  focus_movement_layout.xml

<?xml version="1.0" encoding="utf-8"?>
 <android.support.constraint.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
     <Button
         android:id="@+id/btnTop"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="32dp"
         android:text="Top"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
     <Button
         android:id="@+id/btnBottom"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginBottom="32dp"
         android:text="Bottom"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent" />
 
     <Button
         android:id="@+id/btnLeft"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginLeft="16dp"
         android:text="Left"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
     <Button
         android:id="@+id/btnRight"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginRight="16dp"
         android:text="Right"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
     <Button
         android:id="@+id/btnCenter"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="Center"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         android:nextFocusUp="@id/btnBottom" 
         android:nextFocusDown="@id/btnTop"
         android:nextFocusLeft="@id/btnRight"
         android:nextFocusRight="@id/btnLeft" />
 </android.support.constraint.ConstraintLayout>

 

File Name:  MainActivity.java

package com.bccfalna.arithmetic;
 
 import android.app.Activity;
 import android.os.Bundle;
 
 public class MainActivity extends Activity{
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.focus_movement_layout);
     }
 }

जब हम उपरोक्‍त Example App Create करके Run करते हैं और उसमें Highlight किए गए XML Attributes को Specify नहीं करते, तो उस स्थिति में Keyboard के Up Arrow को Press करने पर Focus, Top Button पर Move होता है, Down Arrow को Press करने पर Focus, Top Button से Center और फिर Center Button से Bottom Button पर Move होता है, जो कि Focus Algorithm का Default Behavior है।

लेकिन जब हम उपरोक्‍तानुसार Highlight किए गए XML Attributes को अपनी Layout File में Specify करने के बाद इसी Android App को फिर से Run करते हैं, तो इस बार Keyboard के Up Arrow को Press करने पर Focus, Bottom Button पर Move हो जाता है क्‍योंकि हमने btnCenter Button के अन्‍तर्गत android:nextFocusUp=@id/btnBottom” ID Set करके Android System के Default Focus Algorithm की Working को Exectly Reverse कर दिया है।

इसी तरह से जब Focus Center Button पर होता है, तब Keyboard के Down Arrow को Press करने पर Focus, Top Button पर Place हो जाता है क्‍योंकि हमने btnCenter Button के अन्‍तर्गत android:nextFocusDown=@id/btnTop” ID Set करके यहां भी Android System के Default Focus Algorithm की Working को Exectly Reverse कर दिया है।

इसके अलावा यदि हम हमारे Android App Layout के किसी ऐसे View पर Focus Set करना चाहते हैं, जो कि सामान्‍यत: Focusable नहीं होता, तो हमें उस UI View के अन्‍तर्गत केवल android:focusable XML Attribute को true Set करना होता है।

उदाहरण के लिए सामान्‍यत: किसी भी Android App में TextView UI View Focusable नहीं होते। लेकिन यदि हमें किसी TextView पर Focus Set करना हो, तो उस Specific TextView UI View Control के अन्‍तर्गत इस Attribute को Specify कर देने मात्र से वह Focusable हो जाएगा और फिर Android System, Keyboard के Arrow Keys के माध्‍यम से Navigation करने पर उस TextView Control पर भी Focus को Move करेगा।

जबकि यदि हम उसी TextView Control को Touch Mode में भी Focusable बनाना चाहें, तो android:focusable=”true के साथ ही android:focusableInTouchMode=”true XML Attribute भी Set कर सकते हैं। ते हैं।

इसके अलावा कोई Specific View, Focus Accept करे, इस हेतु हम उसके लिए requestFocus() Method को भी Invode कर सकते हैं और Focus Event को Listen करने अथवा किसी View द्वारा Focus को Receive या Loose करने पर Notify होने के लिए onFocusChange() Callback Method को भी Implement कर सकते हैं जो कि किसी UI View द्वारा Focus को Gain/Loose करने यानी FocusChange Event Fire होने पर Execute होता है।

Event Capturing and Event Bubbling in Android

Android in Hindi - BccFalna.comये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Android in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।

Android in Hindi | Page: 628 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE

Download All EBooks

सभी हिन्दी EBooks के DEMO DOWNLOAD LINKS प्राप्‍त करें, अपने EMail पर।

Register करके Login करें। इस Popup से छुटकारा पाएें।