Jaka jest klasa R w systemie Android?


90

W AndroidStudio, kiedy tworzę projekt przy użyciu pustego działania, otrzymuję następujący fragment kodu w MainActivity.javapliku:

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

gdzie Rjest używana tajemnicza klasa o nazwie . Jaki jest cel tych zajęć R?

Odpowiedzi:


119

Rjest klasą zawierającą definicje wszystkich zasobów określonego pakietu aplikacji . Znajduje się w przestrzeni nazw pakietu aplikacji .

Na przykład, jeśli w swoim manifeście powiesz, że nazwa pakietu to com.foo.bar, Rklasa jest generowana z symbolami wszystkich zasobów w formacie com.foo.bar.R.

Zazwyczaj masz do czynienia z dwiema R klasami

  1. Zasoby ramowe w android.Ri
  2. Twoja własna, w Twojej przestrzeni nazw

Jest on nazwany Rdlatego, że stoi za R esources, i nie ma sensu w podejmowaniu ludzie typu coś dłużej, zwłaszcza, że powszechne jest skończyć z dość długich nazw symboli po nim, które mogą spowodować godziwą kwotę skrypcie.


11
Po rozwiązaniu wszystkich problemów i kontynuowaniu książki, mogę dodać (z książki): Jest to automatycznie generowana klasa narzędziowa, która zawiera odniesienia do zasobów w projekcie. Nazywa się to „klasą R”, ponieważ nazywa się R.java . Jest generowany przez AAPT z zasobów zdefiniowanych w folderze res .
Android Eve

1
Co to jest android.R?
Malwinder Singh

14
Jest sens, aby ludzie pisali coś dłużej: nazywa się to czystym kodem i może jeszcze nie dotrzeć do wszystkich. Klasy jednoliterowe, rozszerzenia, zmienne mogą być dobre w kontekście lokalnym, ale nigdy globalnie. Takie brzydkie nazwy prowadzą do takich zbędnych pytań.
brainray

23

Co to jest R: Nie ma nic bardzo tajemniczego w R. To tylko klasa, która ma wiele statycznych podklas, otwórz ją w zaćmieniu i spójrz (jej pod gen /).

Każdy element tej klasy jest jedną z dwóch rzeczy: 1) statyczne klasy końcowe lub 2) statyczne końcowe liczby całkowite, które są unikalne w stosunku do innych członków swojej klasy.

Dlaczego jest tak tajemniczy: łatwo się pomylić, ponieważ R jest automatycznie generowany przez mrówkę. Jest to tajemnicze, ponieważ nie powinieneś go „dotykać” ręcznie (oczywiście możesz, ale twoje zmiany zostaną automatycznie usunięte po regeneracji). Jest to dodatkowo tajemnicze, ponieważ czasami zaćmienie automatycznie importuje standardowy plik R Androida (jak omówiono w odpowiedziach powyżej)

Dlaczego zawsze jest pierwszym, którego nie można rozwiązać: R ściśle przestrzega reguł klas i pakietów Java, nie ma nic specjalnego w tym, jak R działa w odniesieniu do importu. R zostanie automatycznie umieszczony w pakiecie określonym we wpisie pakietu w pliku manifestu

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

Aby zobaczyć, do jakiego pakietu należy twój plik R, po prostu otwórz folder gen / w eclipse (widok pakietów). Zobaczysz tam jeden pakiet, który będzie miał nazwę określoną w manifeście. Spróbuj go usunąć, wróci, jeśli wszystkie twoje zasoby będą zgodne z prawidłowymi regułami nazewnictwa, a wszystkie pliki xml będą zgodne z prawidłowymi regułami xml i jeśli automatyczne budowanie jest włączone w eclipse.

Kluczem do zrozumienia pliku R jest uświadomienie sobie, że znajduje się on w tym samym pakiecie co inne klasy, nawet jeśli znajduje się w innym katalogu niż inne pliki należące do Twojego pakietu „głównego”. Po zrozumieniu tego i zrozumieniu składni i nazewnictwa plików zasobów rozwiązywanie problemów z językiem R jest łatwe.


3

R to nazwa Twoich zasobów. Każdy zasób, do którego masz dostęp R.$FOLDER.$RESOURCElub coś bardzo podobnego.

Jeśli nie można go rozwiązać, upewnij się, że ścieżka jest poprawna, a zasób, do którego istnieje odwołanie, istnieje (z uwzględnieniem wielkości liter; uwzględnij rozszerzenie).

Poza tym myląca część (przynajmniej dla mnie) polega na tym, że są dwa różne R. Jeśli otrzymujesz wiele błędów „Nie można rozwiązać”, spróbuj sprawdzić, co importujesz. Spróbuj go zmienić lub usunąć. Lub możesz spróbować wyczyścić swój projekt (OSTRZEŻENIE: czasami sprawia to, że sytuacja jest gorsza niż jest).


Tak, sprzątanie mojego projektu wydaje się być codzienną rutyną - zaćmienie zawsze szaleje i zapominamy, ale dobre sprzątanie wydaje się naprawiać rzeczy (chociaż nigdy nie doświadczyłem, że rzeczy są gorsze niż już są, jak wspomina John) .
Brian D

@Brian: Kiedy czyszczę projekt, Eclipse niszczy i regeneruje mój Rplik. Od czasu do czasu pomija krok „regeneruj”, pozostawiając mnie bez (lub z pustym) Ri Rjest zaprogramowany tak, aby automatycznie cofał wszelkie zmiany wprowadzone ręcznie.
John

@John: jakiego systemu operacyjnego używasz, tak z ciekawości?
Brian D

@John, Czyszczenie nie pomaga w moim przypadku. Możesz zobaczyć aktualną listę błędów w tym wątku (na który jeszcze nie udzielono odpowiedzi): stackoverflow.com/questions/4928784/ ...
Android Eve

1

Android R.java to plik generowany automatycznie przez AAPT (narzędzie do pakowania zasobów systemu Android), który zawiera identyfikatory zasobów dla wszystkich zasobów katalogu res /. Jeśli utworzysz dowolny komponent w pliku activity_main.xml, identyfikator odpowiadającego komponentu zostanie automatycznie utworzony w tym pliku. Tego identyfikatora można użyć w pliku źródłowym działania do wykonania dowolnej czynności na komponencie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.