Event Handler Implementation using Member Class

Event Handler Implementation using Member Class – Android SDK में विभिन्‍न प्रकार के Views जो भी Event Fire कर सकते हैं, उन सभी प्रकार के Events को Listen करने के लिए किसी न किसी Listener Interface को Define किया गया है और प्रत्‍येक View UI Control किस-किस तरह के Events को Listen कर सकता है, इसे निश्चित करने के लिए विभिन्‍न प्रकार के Listener Interfaces की विस्‍तृत जानकारी को Android Developer Site पर android.view Package के Interfaces Section से प्राप्‍त कर सकते हैं जहां सामान्‍यत: प्रत्‍येक Listener Interfacer के नाम में “Listener” Word Included होता है।

उदाहरण के लिए जब किसी View पर Click किया जाता है, तो View.OnClickListener Event Fire होता है, जब किसी View को कुछ ज्‍यादा देर तक Pressed रखा जाता है, तो View.OnLongClickListener Event Fire होता है, जब किसी View को Scroll किया जाता है, तो View.OnScrollChangeListener Event Fire होता है और जैसा कि आप देख सकते हैं कि इन सभी में Listener Word Included है जिससे आप आसानी से पहचान कर सकते हैं कि किस तरह की जरूरत को पूरा करने से सम्‍बंधित किस Event को Handle करने के लिए किस Listener Interface को Implement करना है।

चूंकि, हमारे Current Example में हमें Add Button पर Click करने के Response में दो संख्‍याओं का जोड़ करना है, अत: Button के Click Event को Handle करने के लिए हमें View.OnClickListener Interface को Implement करना होगा और इस Listener में onClick() नाम का केवल एक ही Abstract Method है, जिसे Event Handler के रूप में Define करना होगा क्‍योंकि यही वह Callback Method है, जो तब Execute होगा जब इसके Listener Interface से Associated UI View Control यानी Button Control पर Click किया जाएगा।

Java Programming Language हमें किसी Interface को कई तरीकों से Implement करने की सुविधा Provide करता है और उन्‍हीं में से सबसे पहले तरीके के अन्‍तर्गत हम Activity की Class के अन्‍दर ही एक Private Member Class Create करते हैं और उसी Member Class में Listener Interface को Implement कर लेते हैं।

इस तरीके को सामान्‍यत: तब Use किया जाता है, जब कई Listeners को समान प्रकार की Processing करनी होती है और सभी Processings को एक Single Class द्वारा ही Handle किया जाना Possible होता है ताकि कम से कम Program Codes द्वारा ज्‍यादा से ज्‍यादा Operations Perform किए जा सकें।

उदाहरण के लिए यदि हम एक Simple Calculator का Example लें जिस पर Addition, Subtraction, Multiplication, DivisionReminder Return करने से सम्‍बंधित 5 Button Controls हों, तो पांचो ही Buttons एक तरह से Similar Program Codes Execute करते हुए Result Return करते हैं। यानी यदि हमें दो संख्‍याओं का जोड़ करना हो, तो result = firstNumber + secondNumber Expression Execute कर सकते हैं जबकि यदि हमें दो संख्‍याओं का गुणा करना हो, तो इसी Expression को result = firstNumber * secondNumber लिख सकते हैं।

इस तरह के काफी हद तक Similar Program Logics के Execution द्वारा Return होने वाले Results को Generate करने के लिए हम एक ही Event Listener Class को Multiple UI Controls द्वारा Fire किए जाने वाले समान Events को Handle करने के लिए Common रूप से Use कर सकते हैं और ऐसा करने का सबसे Best तरीका यही होता है कि हम Event Listener Class को सम्‍बंधित UI Activity की Class के Member Class या Nested Class की तरह Define कर लें और सभी Buttons के लिए समान Event Listener Class के onClick() Callback Method को Execute करें।

फिर इसी onClick() Callback Method में इस बात का पता लगाऐं कि किस Button पर Click किया गया है और उसी Button के According Addition, Subtraction, Multiplication, Division या Reminder का Expression Execute करके Result को Output Screen पर Display कर दिया जाए। इसी प्रक्रिया पर आधारित पूरा Example निम्‍नानुसार है-

File Name: strings.xml

<resources>
 <string name="app_name">Simple Calculator</string>
 <string name="fn">First Number</string>
 <string name="sn">Second Number</string>
 <string name="result">Result</string>

 <string name="add">+</string>
 <string name="sub">-</string>
 <string name="mul">x</string>
 <string name="div">/</string>
 <string name="Rem">%</string>

 <dimen name="layoutPadding">5dp</dimen>
</resources>

File Name: activity_main.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="wrap_content"
 android:padding="@dimen/layoutPadding"
 tools:context="com.bccfalna.arithmetic.MainActivity">

<TextView
 android:id="@+id/tvFN"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/sn"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintTop_toTopOf="@+id/etFN"
 android:layout_marginTop="22dp" />

<TextView
 android:id="@+id/tvSN"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 android:layout_marginTop="25dp"
 android:text="@string/fn"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintTop_toBottomOf="@+id/tvFN" />

<EditText
 android:id="@+id/etFN"
 android:layout_width="0dp"
 android:layout_height="39dp"
 android:layout_marginLeft="40dp"
 android:layout_marginStart="40dp"
 android:layout_marginTop="8dp"
 android:ems="10"
 android:text="0"
 android:inputType="numberDecimal"
 app:layout_constraintHorizontal_bias="0.0"
 app:layout_constraintLeft_toRightOf="@+id/tvFN"
 app:layout_constraintRight_toRightOf="parent"
 app:layout_constraintTop_toTopOf="parent" />

<TextView
 android:id="@+id/tvRes"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 android:layout_marginTop="18dp"
 android:text="@string/result"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintTop_toBottomOf="@+id/tvSN" />

<EditText
 android:id="@+id/etSN"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 android:layout_marginTop="5dp"
 android:ems="10"
 android:text="0"
 android:inputType="numberDecimal"
 app:layout_constraintHorizontal_bias="0.0"
 app:layout_constraintLeft_toLeftOf="@+id/etFN"
 app:layout_constraintRight_toRightOf="@+id/etFN"
 app:layout_constraintTop_toBottomOf="@+id/etFN" />

<TextView
 android:id="@+id/tvResult"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 android:layout_marginTop="5dp"
 android:textSize="25sp"
 android:textStyle="bold"
 app:layout_constraintLeft_toLeftOf="@+id/etSN"
 app:layout_constraintRight_toRightOf="@+id/etFN"
 app:layout_constraintTop_toBottomOf="@+id/etSN"
 app:layout_constraintHorizontal_bias="0.0" />

<Button
 android:id="@+id/btnAdd"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/add"
 app:layout_constraintRight_toLeftOf="@+id/btnSub"
 app:layout_constraintTop_toTopOf="@+id/btnSub" />

<Button
 android:id="@+id/btnSub"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/sub"
 app:layout_constraintRight_toLeftOf="@+id/btnMul"
 app:layout_constraintTop_toTopOf="@+id/btnMul" />

<Button
 android:id="@+id/btnMul"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/mul"
 app:layout_constraintRight_toLeftOf="@+id/btnDiv"
 app:layout_constraintTop_toTopOf="@+id/btnDiv" />

<Button
 android:id="@+id/btnDiv"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/div"
 app:layout_constraintTop_toTopOf="@+id/btnRem"
 app:layout_constraintRight_toLeftOf="@+id/btnRem" />

<Button
 android:id="@+id/btnRem"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/Rem"
 app:layout_constraintTop_toBottomOf="@+id/tvRes"
 android:layout_marginTop="5dp"
 app:layout_constraintRight_toRightOf="parent" />
 </android.support.constraint.ConstraintLayout>

File NameMainActivity.java

package com.bccfalna.arithmetic;
 
 import android.app.Activity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.TextView;
 
 public class MainActivity extends Activity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         //Attach an Object of ClickHandler Listener Class to each Button
         findViewById(R.id.btnAdd).setOnClickListener(new ClickHandler());
         findViewById(R.id.btnSub).setOnClickListener(new ClickHandler());
         findViewById(R.id.btnMul).setOnClickListener(new ClickHandler());
         findViewById(R.id.btnDiv).setOnClickListener(new ClickHandler());
         findViewById(R.id.btnRem).setOnClickListener(new ClickHandler());
     }
 
     private class ClickHandler implements View.OnClickListener {
         public void onClick(View btnClicked) {
             // Get a reference to the etFN EditText of Layout
             EditText etFN = (EditText) findViewById(R.id.etFN);
 
             // Get a reference to the etSN EditText of Layout
             EditText etSN = (EditText) findViewById(R.id.etSN);
 
             // Get a reference to the tvResult TextView of Layout
             TextView tvResult = (TextView) findViewById(R.id.tvResult);
 
             // Type Cast etFN and etSN Text into String and then into Value
             double fn = Double.parseDouble(etFN.getText().toString());
             double sn = Double.parseDouble(etSN.getText().toString());
 
             switch (btnClicked.getId()) {
                 case R.id.btnAdd:
                     // tvResult = etFN + etSN
                     tvResult.setText(String.valueOf(fn + sn));
                     break;
 
                 case R.id.btnSub:
                     // tvResult = etFN - etSN
                     tvResult.setText(String.valueOf(fn - sn));
                     break;
 
                 case R.id.btnMul:
                     // tvResult = etFN x etSN
                     tvResult.setText(String.valueOf(fn * sn));
                     break;
 
                 case R.id.btnDiv:
                     // tvResult = etFN / etSN
                     tvResult.setText(String.valueOf(fn / sn));
                     break;
 
                 case R.id.btnRem:
                     // tvResult = etFN % etSN
                     tvResult.setText(String.valueOf(fn % sn));
                     break;
                 default:
                     // Nothing to specify
             }
         }
     }
 }

जब हम इस Example को Run करते हैं तो हमें अगले चित्रानुसार Output Layout प्राप्‍त होता है और यदि आपने पिछले Chapter को ठीक से समझा है, तो activity_main.xmlstring.xml File में जो XML Codes लिखे हैं, उसे आप समझने में आपको निश्चित रूप से कोई परेशानी नहीं हो रही होगी।

Event Handler Implementation using Member Class - Step by Step in Hindi

इसलिए अब हम सीधे ही ActivityMain.java File में लिखे गए Program Logic यानी Java Codes को समझेंगे।

किसी भी Java GUI Program में Event Handling करने के लिए हमें तीन चीजों की जरूरत होती है-

  • UI View Object जो कि Event Fire करता है।
  • Fire होने वाले Event को Listen करने वाले Event Listener Class का Object, जो कि Fire होने वाले Event से Notify होता है और
  • Callback Event Handler Method, जो कि Notify होने वाले Event Listener Object के माध्‍यम से Fire होने वाले Event को Response करता है।

अब यदि हम हमारे Example के अनुसार इन तीनों को Identify करें, तो-

Simple Calculator पर दिखाई देने वाले Buttons वे UI View Controls हैं जो Click नाम का Event Fire करते हैं।

जैसे ही कोई Button, Click Event Fire करता है, उसे Capture करने के लिए किसी न किसी Event Listener Class को Define किया गया होता है और हमारे Example में उस Listener Class का नाम HandleClick है क्‍योंकि इसी Class में हमने हमारे Current Activity के Layout द्वारा Fire होने वाले किसी भी प्रकार के Click Event को Capture करने के लिए OnClickListener नाम के Interface को Implement किया है।

लेकिन कोई भी Callback Event Handler Method तब तक Execute नहीं हो सकता, जब तक कि Event Fire करने वाले UI View Control व Event को Listen करने वाले Event Listener Object के बीच Interconnection न हो। अत: इन दोनों को आपस में Interconnect करने का काम View.setOn…Listener() Method द्वारा किया जाता है।

किस UI View Control द्वारा Fire होने वाले Events को कौनसा Event Listener Response करेगा, View.setOn…Listener() Method द्वारा इसी बात को तय किया जाता है और UI View Control के साथ Event Listener को Attach करने की इस प्रक्रिया को UI View Control Register करना भी कहते हैं।

यदि इसी बात को हम हमारे Example के आधार पर कहें तो किस Button द्वारा Fire होने वाले Click Event को कौनसा Event Listener Capture करके अपने Callback Event Handler Method द्वारा Response करेगा, इस बात को तय करने के लिए हमें onSetClickListener() Method द्वारा ClickHandler नाम के Listener Object के साथ Event Fire करने वाले Button Controls को Register करना होता है।

यानी हमें Android App को Run करने वाले Android System को ये बताना होता है कि हमारे Current Example के पांचों Button Controls द्वारा Fire किए जाने वाले Click Events को ClickHandler Listener Class में Implemented Callback Event Handler Method द्वारा ही Handle या Response किया जाना है और Android System को ये बात बताने के लिए ही हमने निम्‍न Statements द्वारा सभी Button Controls को ClickHandler Class के एक नए Listener Object के साथ Register किया गया है जो कि Listner Class व Event Fire करने वाले Button Controls के बीच एक Interconnection स्‍थापित कर देता है:

findViewById(R.id.btnAdd).setOnClickListener(new ClickHandler());
findViewById(R.id.btnSub).setOnClickListener(new ClickHandler());
findViewById(R.id.btnMul).setOnClickListener(new ClickHandler());
findViewById(R.id.btnDiv).setOnClickListener(new ClickHandler());
findViewById(R.id.btnRem).setOnClickListener(new ClickHandler());

यदि पहले Statement को देखें, तो ये Statement Underlying Android System को कहता है कि Current Activity के Layout में जिस UI View Control का ID btnAdd है, उसके द्वारा जो भी Click Events Fire होंगे, उन्‍हें Handle करने का काम ClickHandler नाम की Class द्वारा किया जाएगा।

इसी तरह से दूसरे Statement द्वारा Underlying Android System को ये कहा गया है कि Current Activity के Layout में जिस UI View Control का ID btnSub है, उसके द्वारा जो भी Click Events Fire होंगे, उन्‍हें Handle करने का काम ClickHandler नाम की Class द्वारा किया जाएगा।

इसी प्रकार से अन्‍य सभी Buttons को भी ClickHandler Class के साथ Register किया गया है ताकि सभी Buttons द्वारा Fire किए जाने वाले Click Events को ClickHandler Class के Callback Event Handler Method द्वारा ही Response किया जाए।

जब उपरोक्‍तानुसार तरीके से हम किसी UI View Control को उसके Event Listener Class के साथ Bind या Register कर सकते हैं, तो उसके बाद जैसे ही वह UI View Control कोई Event Fire करता है, उसकी Registrar Listener Class का Callback Event Handler Method Execute हो जाता है और Fired Event को Handle कर लिया जाता है।

Read more about…

  • Internal Working of Event Handling
  • Method Chaining – Unnamed Objects

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

Android in Hindi | Page: 628 | Format: PDF

BUY NOW GET DEMO REVIEWS