Accessing Resources in Java File in Android App

Accessing Resources in Java File – किसी भी View Object के साथ एक ID Associated हो सकता है, जो उस View Object को Component Tree में Uniquely Identify करने का काम करता है। जब Android App Compile होता है, तो यही ID एक Integer की तरह Reference होता है लेकिन जब ID को किसी Layout XML File में android:id Attribute के साथ Specify किया जाता है, तब ये एक String की तरह Reference होता है।

ये एक ऐसा Attribute है जो View Class द्वारा Defined सभी View Objects के लिए एक Common Attribute होता है और हमें इसे काफी Use करना पड़ता है। क्‍योंकि किसी भी Layout File में प्रत्‍येक Element को Uniquely Identify करने के लिए उसके साथ एक android:id Attribute को Specify किया जाना जरूरी होता है और सभी IDs को “@+id/idName” के रूप में एक निश्चित Format में ही Specify किया जाता है। जैसे:

android:id="@+id/activity_main"

इस Attribute में Value के रूप में Beginning में Specify किया गया @ Symbol Android System को इस बात का Instruction देता है कि उसका XML Parser इस Symbol के बाद Specified पूरी String को Parse करके उसे उस Associated Element या Control के Resource ID की तरह Identify करे।

@ Symbol के Just बाद में Specify किया गया “+” Symbol Android System को इस बात का Instruction देता है, कि ये एक नया Resource Name है, जिसे Create करके R.java File में Add करना है।

R.java Android System द्वारा Automatically Create होने वाली वह Java File है, जिसमें Current Android App के सभी Resources के IDs की एक Class बनती है, जिसके माध्‍यम से उस Android App के विभिन्‍न Resources को किसी भी अन्‍य Java File में Reference किया जाना सम्‍भव हो पाता है और “+” Symbol Android System को यही बताता है कि जिस Element के साथ इस “+” Symbol युक्‍त (Resource Name) ID को Specify किया जा रहा है, उसे R.java File की Class में Add कर दिया जाए, ताकि किसी भी अन्‍य Java Class File में उस Element को उसके (Resource Name) ID के माध्‍यम से Access and Manipulate किया जाना सम्‍भव हो जाए।

+” Symbol वाले इस तरीके से हम जो ID Specify करते हैं, उससे R.java File में Add होने वाली ID हमारे द्वारा Specify की गई Custom ID होती है, लेकिन इसके अलावा भी एक Android Developer के रूप में हमें Android SDK द्वारा कई और IDs Provide की जाती हैं, जिनके माध्‍यम से हम Android System द्वारा Provide किए जाने वाले Resources को Access कर पाते हैं। जैसे @string, @android, @mipmap, @layout, @drawable आदि।

जब एक बार हम किसी View File के किसी Element में इस android:id Attribute को Set कर देते हैं, तो उसके बाद हम उस View File के उस Element के प्रत्‍येक Attribute को किसी भी Java File में findViewById() Method के माध्‍यम से Access कर सकते हैं।

उदाहरण के लिए यदि हम हमारे Current Android App की activity_main.xml File के TextView Control में android:id Attribute Specify करते हुए निम्‍नानुसार Modify कर दें:

<TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Hello World!"
 android:id="@+id/myTextView"/>

तो इस TextView Control को किसी Java File में निम्‍नानुसार Access कर सकते  हैं:

TextView tv = (TextView) findViewById(R.id.myTextView);

यदि हम चाहें तो बिना अलग से View File Create किए हुए सीधे ही Activity की .java File में Layout से सम्‍बंधित सभी Java Codes Manually भी लिख सकते हैं, लेकिन ऐसा करने से हमारा Android App MVC Pattern का Violation कर देगा, क्‍योंकि .java File में हमेंशा Controller Logics होने चाहिए, Display से सम्‍बंधित View Logics नहीं। हालांकि हम जरूरत के अनुसार विभिन्‍न Programming Concepts को समझने के लिए बिना Layout View File के Direct Java Codes के माध्‍यम से भी कुछ Examples Create करेंगे, Professional App Design करते समय ऐसा कभी नहीं करना चाहिए।

उदाहरण के लिए यदि हम हमारे Current Android App की MainActivity.java File के Codes को निम्‍नानुसार Modify कर दें:

File Name: ActivityMain.java
package com.bccfalna.myapp;

import android.app.Activity;
 import android.os.Bundle;
 import android.widget.TextView;

public class MainActivity extends Activity {

@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 TextView tvWithoutView = new TextView(this);
 this.setContentView(tvWithoutView);

 tvWithoutView.setText("Aha! No need of activity_main.xml");
 }
}
Accessing Resources in Java File in Android App - ITeBooks

तो इस Modified Code के साथ Android App को Run करने पर हमें इस चित्र के अनुसार Output Screen प्राप्‍त होता है, जहां हम देख सकते हैं कि यद्धपि हमने अपने Android Project की किसी XML Layout File का Reference setContentView() Method में Parameter की तरह Pass नहीं किया है, फिर भी हमें Screen पर Output दिखाई दे रहा है क्‍योंकि इस Output को हमने onCreate() Method में Highlighted Java Codes के माध्‍यम से ही Create कर लिया है।

कोई भी Android App मूलत: दो Programming Languages XML व Java से बना होता है, इसलिए अच्‍छा Android Developer बनने के लिए जरूरी है कि आप पहले से Java Programming व XML को ठीक-ठाक जानते हों। यदि आपको Java Programming पता है, तो आपके लिए इस MainActivity.java File के लिखे Codes को समझना काफी आसान होगा।

इस Java Program की First Line वास्‍तव में एक Package Statement है, जिसका मतलब ये है कि हम Current File में जो भी Class Create करेंगे, वह com.bccfalna.myapp नाम के Package में Contained होगी, जो कि वास्‍तव में हमारे Hard Disk Drive की किसी Directory का नाम है।

यानी हम हमारे Android App में जितनी भी Classes Create करते हैं, उन सभी को इसी Directory में Saved रखा जाता है, ताकि यदि किसी अन्‍य Android App में हमें वही Functionality प्राप्‍त करनी हो, जिसे प्राप्‍त करने के लिए हमने Current Android App में कोई Class Create की है, तो उस Class को हमें फिर से Create करने की जरूरत नहीं होती, बल्कि हम उस Directory जिसे Package के नाम से Refer किया जा रहा है, में Saved Java Class File के Codes को import Statement के माध्‍यम से अपने नए Android App में ज्‍यों का त्‍यों Use कर सकते हैं।

Package Specify करने के बाद निम्‍नानुसार तीन import Statements द्वारा उन Classes को Current Java File में Import किया गया है, जिनकी जरूरत Current Android App को है:

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

उदाहरण के लिए Activity Class वह Base Class है, जो कि हमारे Android App की Screens को Control व Represent करने से सम्‍बंधित Functionalities Provide करता है, इसलिए पहले import Statement द्वारा android.app Package की Activity Class को Import किया है।

जबकि हमारे Android App की विभिन्‍न Stats को Manage व Handle करने से सम्‍बंधित Functionalities को android.os Package की Bundle Class Provide करता है, इसलिए दूसरे import Statement के माध्‍यम से हमने हमारे Android App की Current Java File में Bundle Class को Import किया है।

और अन्‍त में तीसरे import Statement द्वारा हमने TextView Control की Class को Current Activity की Java File में Import किया है क्‍योंकि Android Screen की Activity पर दिखाई देने वाला TextBox Control कैसा दिखाई देगा और किस तरह से Handle व Control होगा, इससे सम्‍बंधित सभी Functionalities को TextView Class में Specify किया गया है और ये Class android.widget Package में Contained है।

किसी भी Java File में कोई भी Program हमेंशा किसी न किसी Class के अन्‍दर Code किया जाना जरूरी होता है, इसलिए हमारे Current Activity से सम्‍बंधित सभी Functionalities को MainActivity नाम की Class में Code किया जा रहा है और क्‍योंकि ये Class एक Activity Class है, इसलिए एक Activity के काम करने से सम्‍बंधित सभी Basic Functionalities को फिर से Code न करना पड़े, इस हेतु इस MainActivity Class को निम्‍नानुसार Statement द्वारा Activity Class से Inherit किया गया है, ताकि इसकी सभी Functionalities हमारे MainActivity Class में Inherit हो जाए:

public class MainActivity extends Activity {

जिस तरह से किसी भी Programming Language के किसी भी Program का एक Main Entry Point होता है, ठीक उसी तरह से Java के Programs का भी एक Entry Point होता है। लेकिन क्‍योंकि Java Programming Language का प्रयोग करते हुए कई तरह के Frameworks Develop किए गए हैं, इसलिए इसके प्रत्‍येक Program में main() Method नहीं होता।

उदाहरण के लिए जब हम Java आधारित Application Create करते हैं, तब Main Entry Point के रूप में जो File Execute होती है, उसमें main() Method होता है, लेकिन जब हम Java Applet बनाते हैं, तो उसमें कोई main() Method नहीं होता, क्‍योंकि Java Applet कोई Application नहीं बल्कि एक Framework है।

ठीक उसी तरह से Android App का Java Program भी कोई Application नहीं होता बल्कि पूरा Android App एक प्रकार का Framework है जिसका एक निश्चित Lifecycle है और Lifecycle से सम्‍बंधित विभिन्‍न Points से Associated एक निश्चित Method है और onCreate() Method किसी भी Android App का Main Entry Point Method है, जिसे किसी Java Application के main() Method की तरह माना जा सकता है। इसीलिए अगले Statement के रूप में निम्‍नानुसार onCreate() Method को Override किया गया है:

@Override
 protected void onCreate(Bundle savedInstanceState)   {

इस Statement के Just बाद में निम्‍नानुसार Constructor Statement को Specify किया गया है:

super.onCreate(savedInstanceState);

क्‍योंकि किसी भी Android App को Use करते समय User के Android Device पर सामान्‍यत: एक समय में एक ही Android App की Screen दिखाई देती है, जबकि Android एक Multi-Tasking OS है, जिस पर एक समय पर कई Apps Open किए जा सकते हैं। ऐसे में नया App Open होते ही पिछले App के विभिन्‍न Controls के सभी Data को Saved रखना जरूरी होता है, और इस काम को पूरी तरह से Android System द्वारा Bundle Class के एक Object के Reference के माध्‍यम से Automatically Handle किया जाता है, जो कि Parameter के रूप में onCreate() Method में Anonymously Create होता है और Activity Class यानी Current Class की Super Class के Constructor में Parameter के रूप में Pass कर दिया जाता है, ताकि User के Android Device का Android System स्‍वयं इस बात का ध्‍यान रख सके कि कब किस Android App की Stat & Data को Save करना है और कब किस Android App के Stat & Data को Restore करना है।

सरलतम शब्‍दों में कहें तो हमें हमारे किसी भी Android App की किसी भी Activity में onCreate() Method व इसके Just बाद Specify किए गए super.onCreate() Constructor को ज्‍यों का त्‍यों लिखना होता है और इस Constructor Statement के बाद व Closing Curly Brace से पहले तक की जगह पर ही हमें हमारे Program Logics यानी Android App से सम्‍बंधित Program Codes लिखने होते हैं। इसीलिए इसी जगह पर हमने हमारे Android App की MainActivity की First Screen से सम्‍बंधित View Codes को निम्‍नानुसार तरीके से Specify किया है:

TextView tvWithoutView = new TextView(this);
this.setContentView(tvWithoutView);

tvWithoutView.setText("Aha! No need of activity_main.xml");

हमारे Android App की Activity से सम्‍बंधित Screen पर क्‍या और कैसा दिखाई देगा, इस बात को हम दो तरीकों से तय कर सकते हैं। पहला Layout File के माध्‍यम से व दूसरा Java Codes के माध्‍यम से और दोनों ही तरीकों में हमें जो Code लिखना होता है, उसे इसी Highlighted जगह पर ही लिखना होता है, जहां Current Activity File में लिखा है यानी super.onCreate() Constructor Statement के Just बाद और दोनों ही तरीकों में Screen View को Set करने का काम setContentView() Method द्वारा ही किया जाता है।

पिछले Section में हमने अपने Activity के Screen View को Layout File के माध्‍यम से Define किया था और setContentView(R.layout.activity_main) Statement के माध्‍यम से Set किया था, जहां activity_main वह XML File है, जिसे Screen Layout के रूप में Set करना है जबकि इस Section में यही काम हमने this.setContentView(tvWithoutView) Statement के माध्‍यम से किया है, जहां tvWithoutView नाम का TextView वह Control है, जिसके Content को Screen Output के रूप में Set करना है और Screen पर क्‍या दिखाई देगा, इस बात को अगले Statement में setText() Method द्वारा Specify किया है।

इस तरीके का प्रयोग करके भी हम हमारे Android Apps Create कर सकते हैं, लेकिन इस तरह से Develop किया गया Android App भविष्‍य में जरूरत के अनुसार Extend, Update, Edit व Modify करना काफी मुश्किल हो जाता है। साथ ही XML Based Layout Create करने का एक सबसे बड़ा फायदा ये होता है कि हम अलग-अलग Screen Size के लिए अलग-अलग XML Layout Create कर सकते हैं और Activity के setContentView() Method का प्रयोग करते हुए अलग-अलग Screen Size के लिए अलग-अलग XML Layout को Conditionally Load कर सकते हैं।

हालांकि Android व Java से सम्‍बंधित Programming Concepts समझने के लिए हम इस तरीके का प्रयोग करते हुए Demo Android Apps Create कर सकते हैं, लेकिन जब बात Professional Level के Android Apps Develop करने की हो, तब Modal (Data Store), View (Visual Layout Files) व Controller (Java Class Files) तीनों को हमेंशा पूरी तरह से अलग ही रखना चाहिए और Visual Layouts को हमेंशा XML के माध्‍यम से ही Specify करना चाहिए।

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