Android'de R sınıfı nedir?


95

AndroidStudio'da, boş bir etkinlik kullanarak bir proje oluşturduğumda, MainActivity.javadosyada aşağıdaki kod parçasını alıyorum :

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

adlı şifreli bir sınıfın Rkullanıldığı yerde. Bu sınıfın amacı nedir R?

Yanıtlar:


123

Rbelirli bir uygulama paketinin tüm kaynakları için tanımları içeren bir sınıftır . Bu ise uygulama paketinin ad .

Örneğin, bildiriminizde paket adınızın olduğunu söylerseniz, içindeki tüm kaynaklarınızın sembolleriyle com.foo.barbir Rsınıf oluşturulur com.foo.bar.R.

Genelde ilgileneceğiniz iki R sınıf vardır

  1. Çerçeve kaynakları android.Rve
  2. Kendi ad alanınızda

Bu, R kaynakların Rkısaltması olduğu için adlandırılmıştır ve insanların daha uzun bir şeyler yazmasının bir anlamı yoktur, özellikle de ondan sonra oldukça uzun sembol isimleriyle sonuçlanması yaygın olduğundan, bu da makul miktarda satır sarmalayıcıya neden olabilir.


13
Tüm sorunları çözdükten ve kitapla devam ettikten sonra ekleyebilirim (kitaptan): Bu, projedeki kaynaklara referanslar sağlayan, otomatik olarak oluşturulmuş bir yardımcı program sınıfıdır . Adı R.java olduğu için "R sınıfı" olarak adlandırılır . Res klasöründe tanımlanan kaynaklardan AAPT tarafından oluşturulur .
Android Eve

15
İnsanların daha uzun bir şey yazmasının bir anlamı var: buna temiz kod denir ve henüz herkese ulaşmamış olabilir. Bir harf sınıfları, uzantılar, değişkenler yerel bağlamda iyi olabilir, ancak genel olarak asla. Bunun gibi çirkin isimler, bunun gibi gereksiz sorulara yol açar.
brainray

23

R nedir: R hakkında çok gizemli bir şey yoktur. Bu sadece birçok statik alt sınıfı olan, onu tutulmada açan ve bir göz atan (under gen /) bir sınıftır.

Bu sınıfın her üyesi iki şeyden biridir: 1) statik son sınıflar veya 2) sınıflarının diğer üyelerine göre benzersiz olan statik son tamsayılar.

Neden bu kadar şifreli: Kafasını karıştırmak kolaydır çünkü R otomatik olarak karınca tarafından üretilir. Bu şifreli çünkü elle "dokunmanız" gerekmiyor (elbette dokunabilirsiniz, ancak değişiklikleriniz yenilenme üzerine otomatik olarak silinecektir). Ek olarak şifreli çünkü bazen tutulma, androidlerin standart R dosyasını otomatik olarak içe aktarır (yukarıdaki yanıtlarda tartışıldığı gibi)

Neden her zaman çözülemeyen ilk şeydir: R, Java sınıflarının ve paketlerinin kurallarına tam olarak uyar, R'nin içe aktarmaya göre nasıl davrandığına dair özel bir şey yoktur . R, manifest dosyanızdaki paket girişi tarafından belirtilen pakete otomatik olarak yerleştirilecektir.

<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 dosyanızın hangi pakete ait olduğunu görmek için gen / klasörü eclipse'de açın (paket görünümü). Orada listelenmiş bir paket göreceksiniz, manifestinizde belirttiğiniz ada sahip olacaktır. Silmeyi deneyin, tüm kaynaklarınız doğru adlandırma kurallarına uyarsa ve tüm xml dosyalarınız doğru xml kurallarına uyarsa ve tutulmada otomatik olarak derleme etkinleştirilirse geri gelecektir .

R dosyasını anlamanın anahtarı, "ana" paketinize ait diğer dosyalardan farklı bir dizinde olmasına rağmen, diğer sınıflarla aynı pakette olduğunu fark etmektir. Bunu anladıktan ve kaynak dosyalarının sözdizimini ve isimlendirmesini anladıktan sonra, R ile sorunları gidermek kolaydır.


4

R, kaynaklarınızın adıdır. Eriştiğiniz herhangi bir kaynak R.$FOLDER.$RESOURCEveya çok benzer bir şey.

Çözümlenemezse, yolun doğru olduğundan ve başvurulan kaynağın var olduğundan emin olun (büyük / küçük harfe duyarlı; uzantıyı dahil edin).

Ayrıca, kafa karıştıran kısım (zaten bana göre) iki farklı R'ın olmasıdır. Çok sayıda "Çözülemiyor" hatası alıyorsanız, ne aktardığınızı görmeyi deneyin. Değiştirmeyi veya kaldırmayı deneyin. Veya projenizi temizlemeyi deneyebilirsiniz (UYARI: Bazen bu, işleri olduğundan daha kötü hale getirir).


Evet, projemi temizlemek günlük bir rutin gibi görünüyor - tutulma her zaman altüst oluyor ve bir şeyleri unutuyor, ancak iyi bir temizlik işleri düzeltir gibi görünüyor (gerçi, John'un bahsettiği gibi, şimdiye kadar olduğundan daha kötü olan şeyleri hiç yaşamadım) .
Brian D

@Brian: Projemi temizlediğimde Eclipse dosyamı yok ediyor ve yeniden oluşturuyor R. Ara sıra, o (veya boş olan) olmadan beni bırakarak "regenerate" adımını özlüyor kez Rve Rotomatik elle yapılan herhangi bir değişiklik geri alma için programlanmıştır.
John

@John: Merak ettiğim için hangi işletim sistemini kullanıyorsunuz?
Brian D

@John, Temizlik benim durumumda yardımcı olmuyor. Bu ileti dizisindeki gerçek hataların listesini görebilirsiniz (henüz yanıtlanmamış): stackoverflow.com/questions/4928784/…
Android Eve

2

Android R.java, res / dizininin tüm kaynakları için kaynak kimliklerini içeren AAPT (Android Varlık Paketleme Aracı) tarafından otomatik olarak oluşturulan bir dosyadır. Activity_main.xml dosyasında herhangi bir bileşen oluşturursanız, ilgili bileşenin kimliği bu dosyada otomatik olarak oluşturulur. Bu kimlik, bileşen üzerinde herhangi bir eylem gerçekleştirmek için etkinlik kaynak dosyasında kullanılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.