Android में क्लास R क्या है?


89

AndroidStudio में, जब मैं एक खाली गतिविधि का उपयोग करके एक प्रोजेक्ट बनाता हूं, तो मुझे MainActivity.javaफ़ाइल में निम्नलिखित कोड मिलते हैं :

package my.company.my_proj;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

जहां एक क्रिप्टिक क्लास Rका उपयोग किया जाता है। इस वर्ग का उद्देश्य क्या है R?

जवाबों:


117

Rएक वर्ग है जिसमें एक विशेष अनुप्रयोग पैकेज के सभी संसाधनों की परिभाषाएँ हैं । यह एप्लिकेशन पैकेज के नाम स्थान पर है ।

उदाहरण के लिए, यदि आप अपने प्रकट रूप में कहते हैं कि आपका पैकेज नाम है com.foo.bar, तो Rआपके सभी संसाधनों के प्रतीकों के साथ एक वर्ग उत्पन्न होता है com.foo.bar.R।

आम तौर पर दो R वर्ग हैं जिनसे आप निपटेंगे

  1. में ढांचे के संसाधन android.Rऔर
  2. आपका अपना, अपने नामस्थान में

इसका नाम Rइसलिए रखा गया है क्योंकि यह आर स्रोतों के लिए खड़ा है , और लोगों को कुछ लंबे समय तक टाइप करने का कोई मतलब नहीं है, खासकर जब से इसके बाद काफी लंबे प्रतीक नामों के साथ समाप्त होना आम है, जो उचित मात्रा में लाइन रैपर का कारण बन सकता है।


10
सभी समस्याओं को हल करने और पुस्तक के साथ आगे बढ़ने के बाद, मैं (पुस्तक से) जोड़ सकता हूं: यह एक ऑटो-जनरेटेड उपयोगिता वर्ग है जो परियोजना में संसाधनों के संदर्भ प्रदान करता है। इसे "R वर्ग" कहा जाता है क्योंकि इसका नाम R.java है । यह AAPT द्वारा res फ़ोल्डर में निर्धारित रिसोर्स से उत्पन्न होता है ।
— एंड्रॉइड ईव

1
क्या है android.R?
— मालविंदर सिंह

13
एक बिंदु है जो लोगों को कुछ लंबे समय तक टाइप करता है: इसे स्वच्छ कोड कहा जाता है और अभी तक सभी तक नहीं पहुंच सका है। एक अक्षर वर्ग, विस्तार, चर स्थानीय संदर्भ में शायद ठीक हैं, लेकिन विश्व स्तर पर कभी नहीं। इस तरह बदसूरत नाम इस तरह बेमानी सवालों के लिए नेतृत्व करते हैं।
— ब्रेनर्रे

23

R क्या है: R के बारे में कुछ भी बहुत रहस्यमय नहीं है। यह सिर्फ एक वर्ग है जिसमें कई स्थिर उपवर्ग हैं, इसे ग्रहण में खोलें और एक नज़र डालें (इसके अंतर्गत जीन /)।

इस वर्ग का प्रत्येक सदस्य दो चीजों में से एक है: 1) स्थिर अंतिम कक्षाएं या 2) स्थिर अंतिम पूर्णांक जो कि अपने वर्ग के अन्य सदस्यों के संबंध में अद्वितीय हैं।

यह इतना गूढ़ क्यों है: इसका भ्रम होना आसान है क्योंकि R स्वतः चींटी द्वारा उत्पन्न होता है। इसकी गूढ़ विद्या क्योंकि आप इसे मैन्युअल रूप से "स्पर्श" करने के लिए नहीं हैं (बेशक आप कर सकते हैं लेकिन आपके परिवर्तन पुन: उत्थान पर स्वतः मिट जाएंगे)। इसके अतिरिक्त क्रिप्टिक क्योंकि कभी-कभी ग्रहण स्वचालित रूप से एंड्रॉइड मानक आर फ़ाइल आयात करता है (जैसा कि ऊपर दिए गए उत्तरों में चर्चा की गई है)

यह हमेशा पहले वाला क्यों होता है जिसे हल नहीं किया जा सकता है: आर जावा वर्गों और पैकेजों के नियमों का ठीक से पालन करता है, आर आयात के संबंध में आर कैसे कार्य करता है, इसके बारे में कुछ खास नहीं है । R को आपकी मैनिफ़ेस्ट फ़ाइल में पैकेज प्रविष्टि द्वारा निर्दिष्ट पैकेज में स्वचालित रूप से रखा जाएगा

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="package.which.will.contain.R.and.probably.the.main.package.in.the.application" android:versionName="8.6.2011" android:versionCode="1">
    <uses-sdk android:minSdkVersion="13" />

यह देखने के लिए कि आपकी R फाइल किस पैकेज से संबंधित है, केवल ग्रहण / संकुल (दृश्य) में जीन / फ़ोल्डर खोलें। आपको वहां सूचीबद्ध एक पैकेज दिखाई देगा, इसमें वह नाम होगा जो आपने अपने घोषणापत्र में निर्दिष्ट किया है। इसे हटाने का प्रयास करें, यह वापस आ जाएगा यदि आपके सभी संसाधन सही नामकरण नियमों का पालन करते हैं और आपकी सभी xml फाइलें सही xml नियमों का पालन करती हैं और यदि निर्माण स्वचालित रूप से ग्रहण में सक्षम है।

आर फ़ाइल को समझने की कुंजी यह महसूस करना है कि यह अन्य वर्गों के समान पैकेज में है भले ही यह एक अलग निर्देशिका में हो फिर आपके "मुख्य" पैकेज से संबंधित अन्य फाइलें। जब आप इसे समझ लेते हैं और R के साथ समस्याओं का निवारण करने वाली संसाधन फ़ाइलों के सिंटैक्स और नामकरण को समझ लेते हैं तो यह आसान है।


3

R आपके संसाधनों का नाम है। आपके द्वारा उपयोग किया जाने वाला कोई भी संसाधन R.$FOLDER.$RESOURCEया कुछ इसी तरह का।

यदि इसे हल नहीं किया जा सकता है, तो सुनिश्चित करें कि मार्ग सही है और संदर्भित संसाधन मौजूद है (केस-संवेदी; एक्सटेंशन शामिल करें)।

इसके अलावा, भ्रमित करने वाला हिस्सा (मेरे लिए, वैसे भी) दो अलग-अलगR हैं । यदि आपको बहुत अधिक "त्रुटियों का समाधान नहीं किया जा रहा है" तो, यह देखने की कोशिश करें कि आप क्या आयात कर रहे हैं। इसे बदलने या हटाने का प्रयास करें। या आप अपने प्रोजेक्ट को साफ करने की कोशिश कर सकते हैं (चेतावनी: कभी-कभी जो चीजें पहले से ही बदतर होती हैं)।


हां, मेरी परियोजना की सफाई एक दैनिक दिनचर्या लगती है - ग्रहण सदैव अस्तव्यस्त रहता है और चीजों को भूल जाता है, लेकिन एक अच्छी सफाई चीजों को ठीक करने लगती है (हालांकि मैंने कभी भी चीजों को पहले से भी बदतर होने का अनुभव नहीं किया, जैसा कि जॉन उल्लेख करते हैं) ।
— ब्रायन डी

@ ब्रायन: जब मैं अपनी परियोजना को साफ करता हूं, तो ग्रहण मेरी Rफाइल को नष्ट कर देता है और पुनर्जीवित करता है। एक बार थोड़ी देर में, यह "पुनर्जीवित" कदम को याद किए बिना मुझे छोड़ देता है (या एक खाली के साथ) Rऔर Rस्वचालित रूप से हाथ से किए गए किसी भी परिवर्तन को पूर्ववत करने के लिए प्रोग्राम किया जाता है।
— जॉन

@ जॉन: क्या ओएस का उपयोग कर रहे हैं, बस जिज्ञासा से बाहर?
— ब्रायन डी

@ जॉन, सफाई मेरे मामले में मदद नहीं करता है। आप इस थ्रेड में त्रुटियों की वास्तविक सूची देख सकते हैं (जिसका उत्तर अभी तक नहीं दिया गया है): stackoverflow.com/questions/4928784/…
— एंड्रॉइड ईव

1

Android R.java AAPT (एंड्रॉइड एसेट पैकेजिंग टूल) द्वारा एक ऑटो-जेनरेट की गई फ़ाइल है, जिसमें रिस / डायरेक्टरी के सभी संसाधनों के लिए संसाधन आईडी हैं। यदि आप activity_main.xml फ़ाइल में कोई भी घटक बनाते हैं, तो संबंधित घटक के लिए आईडी स्वचालित रूप से इस फ़ाइल में बनाई जाती है। घटक पर किसी भी क्रिया को करने के लिए इस आईडी का उपयोग गतिविधि स्रोत फ़ाइल में किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.