Що таке клас R в Android?


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тому, що це означає R resources, і немає сенсу змушувати людей набирати щось довше, тим більше, що зазвичай трапляються досить довгі імена символів після цього, що може спричинити неабияку кількість обгортки рядків.


10
Після вирішення всіх проблем і продовження роботи з книгою я можу додати (з книги): Це автоматично згенерований утилітний клас, який містить посилання на ресурси в проекті. Його називають "класом R", оскільки його ім'я - R.java . Він генерується AAPT із ресурсів, визначених у папці res .
Android Eve,

1
Що це таке android.R?
Malwinder Singh

13
Є сенс змусити людей набирати щось довше: це називається чистий код і, можливо, ще не досягнуто всіх. Класи, розширення, змінні на одну букву можуть бути чудовими в локальному контексті, але ніколи в усьому світі. Потворні імена, подібні до цього, призводять до зайвих питань, подібних до цього.
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 стає простим.


3

R - це назва ваших ресурсів. Будь-який ресурс, до якого ви отримуєте доступ, R.$FOLDER.$RESOURCEабо щось подібне.

Якщо його не вдається вирішити, переконайтеся, що шлях правильний, а ресурс, на який посилається, існує (з урахуванням регістру; включіть розширення).

Крім того, незрозуміла частина (як би це не було для мене) полягає в тому, що є дві різні R. Якщо ви отримуєте багато помилок "Не вдається вирішити", спробуйте переглянути, що ви імпортуєте. Спробуйте змінити або видалити його. Або ви можете спробувати очистити свій проект (ПОПЕРЕДЖЕННЯ: Іноді це робить речі гіршими, ніж вони вже є).


Так, прибирання мого проекту, здається, є щоденною рутиною - затемнення завжди виходить з ладу і забуває речі, але хороша чистка, здається, все виправляє (хоча я ніколи не відчував, щоб справи були гіршими, ніж вони вже є, як згадує Джон) .
Brian D

@Brian: Коли я очищаю свій проект, Eclipse знищує та регенерує мій Rфайл. Час від часу він пропускає крок "регенерації", залишаючи мене без (або з порожнім) Rі Rзапрограмований на автоматичне скасування будь-яких змін, зроблених вручну.
Джон

@ John: яку ОС ви використовуєте, просто з цікавості?
Brian D

@ Джон, прибирання не допомагає в моєму випадку. Ви можете побачити фактичний список помилок у цій темі (на яку ще не відповіли): stackoverflow.com/questions/4928784/…
Android Eve,

1

Android R.java - це автоматично сформований файл AAPT (Інструмент упаковки активів Android), який містить ідентифікатори ресурсів для всіх ресурсів каталогу res /. Якщо ви створюєте будь-який компонент у файлі activity_main.xml, ідентифікатор відповідного компонента автоматично створюється в цьому файлі. Цей ідентифікатор можна використовувати у вихідному файлі активності для виконання будь-яких дій із компонентом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.