คลาส R ใน Android คืออะไร?


94

ใน 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คืออะไร?

คำตอบ:


122

Rเป็นชั้นที่มีคำจำกัดความสำหรับทรัพยากรทั้งหมดของแพคเกจโปรแกรมโดยเฉพาะอย่างยิ่ง มันมีอยู่ในnamespace ของแพคเกจโปรแกรมประยุกต์

ตัวอย่างเช่นถ้าคุณพูดในที่ประจักษ์ชื่อแพคเกจของคุณจะcom.foo.barเป็นระดับที่ถูกสร้างขึ้นด้วยสัญลักษณ์ของทรัพยากรทั้งหมดของคุณในRcom.foo.bar.R

โดยทั่วไปมีสอง Rคลาสที่คุณจะต้องจัดการ

  1. ทรัพยากรกรอบในandroid.Rและ
  2. ของคุณเองในเนมสเปซของคุณ

ได้รับการตั้งชื่อRเนื่องจากย่อมาจากR esources และไม่มีประเด็นใดที่จะทำให้ผู้คนพิมพ์บางสิ่งได้นานขึ้นโดยเฉพาะอย่างยิ่งเนื่องจากเป็นเรื่องปกติที่จะลงท้ายด้วยชื่อสัญลักษณ์ที่ค่อนข้างยาวหลังจากนั้นซึ่งอาจทำให้เกิดกระดาษห่อบรรทัดจำนวนพอสมควร


13
หลังจากแก้ปัญหาทั้งหมดและดำเนินการกับหนังสือแล้วฉันสามารถเพิ่ม (จากหนังสือ): นี่คือคลาสยูทิลิตี้ที่สร้างขึ้นโดยอัตโนมัติซึ่งให้การอ้างอิงถึงทรัพยากรในโครงการ มันถูกเรียกว่า "อาร์คลาส" เพราะชื่อของมันคือR.java สร้างโดย AAPT จากทรัพยากรที่กำหนดไว้ภายในโฟลเดอร์res
Android Eve

15
มีจุดหนึ่งที่ทำให้ผู้คนพิมพ์บางสิ่งได้นานขึ้นซึ่งเรียกว่ารหัสสะอาดและอาจยังไม่ถึงทุกคน คลาสตัวอักษรหนึ่งตัวส่วนขยายตัวแปรอาจใช้ได้ดีในบริบทเฉพาะที่ แต่ไม่สามารถใช้ได้ทั่วโลก ชื่อที่น่าเกลียดเช่นนี้ทำให้เกิดคำถามซ้ำซ้อนเช่นนี้
brainray

23

R คืออะไร: ไม่มีอะไรลึกลับเกี่ยวกับ R มันเป็นเพียงคลาสที่มีคลาสย่อยคงที่มากมายเปิดขึ้นในคราสและดู (ภายใต้ gen /)

สมาชิกทุกคนของคลาสนี้เป็นหนึ่งในสองสิ่ง: 1) คลาสสุดท้ายแบบคงที่หรือ 2) จำนวนเต็มสุดท้ายแบบคงที่ซึ่งไม่ซ้ำกันเมื่อเทียบกับสมาชิกคนอื่น ๆ ในคลาสของตน

ทำไมมันถึงคลุมเครือ: มันง่ายที่จะสับสนเพราะ R ถูกสร้างขึ้นโดยอัตโนมัติโดยมด มันเป็นความลับเพราะคุณไม่ควร "สัมผัส" ด้วยตนเอง (แน่นอนว่าคุณทำได้ แต่การเปลี่ยนแปลงของคุณจะถูกลบโดยอัตโนมัติเมื่อมีการสร้างใหม่) มันเป็นความลับเพิ่มเติมเนื่องจากบางครั้งคราสจะนำเข้าไฟล์ R มาตรฐานของ Android โดยอัตโนมัติ (ตามที่กล่าวไว้ในคำตอบด้านบน)

เหตุใดจึงเป็นสิ่งแรกที่ไม่สามารถแก้ไขได้เสมอ: R เป็นไปตามกฎของคลาส Java และแพ็กเกจไม่มีอะไรพิเศษเกี่ยวกับการที่ 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 ของคุณเป็นแพ็กเกจใดเพียงแค่เปิด gen / โฟลเดอร์ใน eclipse (มุมมองแพ็คเกจ) คุณจะเห็นแพคเกจหนึ่งรายการที่นั่นจะมีชื่อที่คุณระบุไว้ในรายการของคุณ ลองลบมันจะกลับมาหากรีซอร์สทั้งหมดของคุณเป็นไปตามกฎการตั้งชื่อที่ถูกต้องและไฟล์ xml ทั้งหมดของคุณเป็นไปตามกฎ xml ที่ถูกต้องและหากบิวด์เปิดใช้งานโดยอัตโนมัติใน eclipse

กุญแจสำคัญในการทำความเข้าใจไฟล์ R คือการตระหนักว่าไฟล์นั้นอยู่ในแพ็กเกจเดียวกันกับคลาสอื่น ๆ แม้ว่าจะอยู่ในไดเร็กทอรีอื่นก็ตามไฟล์อื่น ๆ ที่อยู่ในแพ็กเกจ "หลัก" ของคุณ หลังจากที่คุณเข้าใจสิ่งนี้และเข้าใจไวยากรณ์และการตั้งชื่อไฟล์ทรัพยากรการแก้ปัญหาด้วย R ก็ทำได้ง่ายๆ


4

R คือชื่อทรัพยากรของคุณ ทรัพยากรใด ๆ ที่คุณเข้าถึงโดยR.$FOLDER.$RESOURCEหรือสิ่งที่คล้ายกันมาก

หากไม่สามารถแก้ไขได้ตรวจสอบให้แน่ใจว่าเส้นทางนั้นถูกต้องและมีทรัพยากรที่อ้างอิงอยู่ (พิจารณาตัวพิมพ์เล็กและใหญ่รวมส่วนขยาย)

นอกจากนี้ส่วนที่ทำให้เกิดความสับสน (ให้ฉันอยู่แล้ว) ก็คือว่ามีสองที่แตกต่างกันRของ หากคุณได้รับข้อผิดพลาด "ไม่สามารถแก้ไขได้" จำนวนมากให้ลองดูสิ่งที่คุณกำลังนำเข้า ลองเปลี่ยนหรือถอดออก หรือคุณอาจลองทำความสะอาดโครงการของคุณ (คำเตือน: บางครั้งอาจทำให้สิ่งต่างๆแย่ลงกว่าที่เป็นอยู่แล้ว)


ใช่การทำความสะอาดโครงการของฉันดูเหมือนจะเป็นกิจวัตรประจำวัน - คราสมักจะยุ่งเหยิงและลืมสิ่งต่างๆ แต่การทำความสะอาดที่ดีดูเหมือนจะช่วยแก้ไขปัญหาได้ (แม้ว่าฉันจะไม่เคยประสบกับสิ่งที่เลวร้ายไปกว่าที่เป็นอยู่แล้วก็ตามอย่างที่จอห์นกล่าวถึง) .
Brian D

@ ไบรอัน: เมื่อฉันทำความสะอาดโปรเจ็กต์ของฉัน Eclipse จะทำลายและสร้างRไฟล์ของฉันขึ้นมาใหม่ นาน ๆ ครั้งมันจะพลาดขั้นตอน "สร้างใหม่" ทิ้งไว้โดยไม่มีฉัน (หรือว่างเปล่า) RและRถูกตั้งโปรแกรมให้เลิกทำการเปลี่ยนแปลงใด ๆ ที่ทำด้วยมือโดยอัตโนมัติ
ยอห์น

@ จอห์น: คุณใช้ระบบปฏิบัติการอะไรเพราะความอยากรู้อยากเห็น?
Brian D

@ จอห์นการทำความสะอาดไม่ช่วยในกรณีของฉัน คุณสามารถดูรายการข้อผิดพลาดที่แท้จริงได้ในชุดข้อความนี้ (ซึ่งยังไม่ได้รับคำตอบ): stackoverflow.com/questions/4928784/…
Android Eve

2

Android R.java เป็นไฟล์ที่สร้างขึ้นโดยอัตโนมัติโดย AAPT (Android Asset Packaging Tool) ซึ่งมีรหัสทรัพยากรสำหรับทรัพยากรทั้งหมดของ res / directory หากคุณสร้างคอมโพเนนต์ใด ๆ ในไฟล์ activity_main.xml id สำหรับคอมโพเนนต์ที่เกี่ยวข้องจะถูกสร้างขึ้นโดยอัตโนมัติในไฟล์นี้ รหัสนี้สามารถใช้ในไฟล์แหล่งกิจกรรมเพื่อดำเนินการใด ๆ กับคอมโพเนนต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.