Apa kelas R di Android?

90

Di AndroidStudio, ketika saya membuat proyek menggunakan aktivitas kosong, saya mendapatkan potongan kode berikut di MainActivity.javafile:

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);
    }
}

tempat kelas samar bernama Rdigunakan. Apa tujuan kelas ini R?

Android Eve
sumber

Jawaban:

119

Radalah kelas yang berisi definisi untuk semua sumber daya dari paket aplikasi tertentu . Itu ada di namespace paket aplikasi .

Misalnya, jika Anda mengatakan dalam manifes Anda nama paket Anda adalah com.foo.bar, Rkelas dibuat dengan simbol semua sumber daya Anda di com.foo.bar.R.

Biasanya ada dua R kelas yang akan Anda tangani

  1. Sumber daya kerangka kerja di android.Rdan
  2. Milik Anda, di namespace Anda

Dinamakan Rkarena itu adalah singkatan dari R esources, dan tidak ada gunanya membuat orang mengetik sesuatu lebih lama, terutama karena biasanya berakhir dengan nama simbol yang cukup panjang setelahnya, yang dapat menyebabkan pembungkus baris yang cukup banyak.

hackbod
sumber
11
Setelah menyelesaikan semua masalah dan melanjutkan dengan buku, saya dapat menambahkan (dari buku): Ini adalah kelas utilitas yang dibuat secara otomatis yang memberikan referensi ke sumber daya dalam proyek. Ini disebut "kelas R" karena namanya R.java . Ini dihasilkan oleh AAPT dari sumber daya yang ditentukan dalam folder res .
Android Malam
1
Apa android.R?
Malwinder Singh
14
Ada gunanya membuat orang mengetik lebih lama: itu disebut kode bersih dan mungkin belum menjangkau semua orang. Kelas satu huruf, ekstensi, variabel mungkin baik-baik saja dalam konteks lokal, tetapi tidak pernah secara global. Nama jelek seperti ini menimbulkan pertanyaan mubazir seperti ini.
Brainray
23

Apa R: Tidak ada yang sangat misterius tentang R. Ini hanya sebuah kelas yang memiliki banyak subkelas statis, buka di gerhana dan lihat (di bawah gen /).

Setiap anggota kelas ini adalah salah satu dari dua hal: 1) kelas akhir statis atau 2) bilangan bulat final statis yang unik sehubungan dengan anggota lain dari kelas mereka.

Mengapa begitu samar: Sangat mudah untuk membuat bingung karena R secara otomatis dihasilkan oleh semut. Ini samar karena Anda tidak seharusnya "menyentuhnya" secara manual (tentu saja Anda bisa, tetapi perubahan Anda akan otomatis dihapus saat dibuat ulang). Ini juga samar karena terkadang eclipse secara otomatis mengimpor file R standar Android (seperti yang dibahas dalam jawaban di atas)

Mengapa selalu yang pertama tidak dapat diselesaikan: R mengikuti aturan kelas dan paket Java dengan tepat, tidak ada yang istimewa tentang bagaimana R bertindak sehubungan dengan impor. R akan secara otomatis ditempatkan dalam paket yang ditentukan oleh entri paket di file manifes Anda

<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" />

Untuk melihat paket milik apa file R Anda, cukup buka folder gen / di eclipse (tampilan paket). Anda akan melihat satu paket terdaftar di sana, itu akan memiliki nama yang Anda tentukan di manifes Anda. Cobalah untuk menghapusnya, itu akan kembali jika semua sumber daya Anda mengikuti aturan penamaan yang benar dan semua file xml Anda mengikuti aturan xml yang benar dan jika build secara otomatis diaktifkan di gerhana.

Kunci untuk memahami file R adalah dengan menyadari bahwa ia ada dalam paket yang sama dengan kelas lain meskipun ia berada di direktori yang berbeda dari file lain yang termasuk dalam paket "utama" Anda. Setelah Anda memahami ini dan memahami sintaks dan penamaan file sumber daya, pemecahan masalah dengan R mudah.

tjb
sumber
4

R adalah nama sumber daya Anda. Sumber daya apa pun yang Anda akses R.$FOLDER.$RESOURCEatau sesuatu yang sangat mirip.

Jika tidak dapat diselesaikan, pastikan jalurnya benar dan sumber daya yang dirujuk ada (peka huruf besar-kecil; sertakan ekstensi).

Juga, bagian yang membingungkan (bagi saya, bagaimanapun) adalah bahwa ada dua yang berbeda R. Jika Anda mendapatkan banyak kesalahan "Tidak dapat diselesaikan", coba lihat apa yang Anda impor. Coba ubah atau hapus. Atau Anda dapat mencoba membersihkan proyek Anda (PERINGATAN: Terkadang hal itu memperburuk keadaan).

John
sumber
Ya, membersihkan proyek saya tampaknya menjadi rutinitas sehari-hari - gerhana selalu menjadi kacau dan melupakan banyak hal, tetapi pembersihan yang baik tampaknya memperbaiki keadaan (meskipun saya tidak pernah mengalami hal-hal menjadi lebih buruk dari sebelumnya, seperti yang disebutkan John) .
Brian D
@ Brian: Ketika saya membersihkan proyek saya, Eclipse menghancurkan dan membuat ulang Rfile saya . Kadang-kadang, langkah ini melewatkan langkah "regenerasi" yang membuat saya tidak (atau kosong) Rdan Rdiprogram untuk secara otomatis membatalkan perubahan yang dibuat dengan tangan.
Yohanes
@ John: OS apa yang Anda gunakan, hanya karena penasaran?
Brian D
@ John, Pembersihan tidak membantu dalam kasus saya. Anda dapat melihat daftar kesalahan sebenarnya di utas ini (yang belum dijawab): stackoverflow.com/questions/4928784/…
Android Eve
1

Android R.java adalah file yang dibuat secara otomatis oleh AAPT (Alat Pengemasan Aset Android) yang berisi ID sumber daya untuk semua sumber daya direktori res /. Jika Anda membuat komponen apa pun di file activity_main.xml, id untuk komponen terkait secara otomatis dibuat di file ini. Id ini bisa digunakan di file sumber aktivitas untuk melakukan tindakan apa pun pada komponen.

Sahil
sumber