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

95

В 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?

Android Eve
источник

Ответы:

123

R- это класс, содержащий определения всех ресурсов конкретного пакета приложения . Он находится в пространстве имен пакета приложения .

Например, если вы укажете в своем манифесте имя вашего пакета com.foo.bar, будет создан Rкласс с символами всех ваших ресурсов в com.foo.bar.R.

Как правило, вы будете иметь дело с двумя R классами

  1. Ресурсы фреймворка в android.Rи
  2. Ваш собственный, в вашем пространстве имен

Он назван Rпотому , что означает R ЕСУРСЫ, и нет никакого смысла в том, чтобы люди типа что - то больше, тем более , что он является общим , в конечном итоге с довольно длинными именами символов после него, что может вызвать сумму справедливой линии обертке.

хакбод
источник
13
После решения всех проблем и продолжения работы с книгой я могу добавить (из книги): Это автоматически сгенерированный служебный класс, который предоставляет ссылки на ресурсы в проекте. Он называется «классом R», потому что его имя - R.java . Он создается AAPT из ресурсов, определенных в папке res .
Android Eve
15
Есть смысл заставлять людей печатать что-то длиннее: это называется чистым кодом и, возможно, еще не дошел до всех. Однобуквенные классы, расширения, переменные могут быть хороши в локальном контексте, но никогда в глобальном масштабе. Подобные уродливые имена приводят к таким повторяющимся вопросам.
brainray
23

Что такое R: В R. нет ничего очень загадочного. Это просто класс, который имеет много статических подклассов, откройте его в eclipse и посмотрите (его под gen /).

Каждый член этого класса представляет собой одно из двух: 1) статические конечные классы или 2) статические конечные целые числа, которые уникальны по отношению к другим членам их класса.

Почему это так загадочно: легко запутаться, потому что R автоматически генерируется ant. Это загадочно, потому что вы не должны «трогать» его вручную (конечно, вы можете, но ваши изменения будут автоматически удалены при регенерации). Это дополнительно загадочно, потому что иногда eclipse автоматически импортирует стандартный 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 станет простым.

tjb
источник
4

R - это имя ваших ресурсов. Любой ресурс, к которому вы обращаетесь, R.$FOLDER.$RESOURCEили нечто очень похожее

Если не удается разрешить проблему, убедитесь, что путь указан правильно и ресурс, на который есть ссылка, существует (с учетом регистра; укажите расширение).

Кроме того, сбивает с толку (во всяком случае, для меня) то, что есть два разных R. Если вы получаете много ошибок типа «Не удается устранить», попробуйте посмотреть, что вы импортируете. Попробуйте изменить или удалить его. Или вы можете попробовать очистить свой проект (ПРЕДУПРЕЖДЕНИЕ: иногда это только усугубляет ситуацию).

Джон
источник
Да, уборка моего проекта кажется повседневной рутиной - затмение всегда идет наперекосяк и забывает о вещах, но хорошая уборка, кажется, все исправляет (хотя я никогда не сталкивался с тем, что хуже, чем они есть, как упоминает Джон) .
Brian D
@Brian: Когда я очищаю свой проект, Eclipse уничтожает и восстанавливает мой Rфайл. Время от времени он пропускает этап «регенерации», оставляя меня без (или с пустым), Rи Rзапрограммирован на автоматическую отмену любых изменений, сделанных вручную.
Джон
@ Джон: какую ОС вы используете, просто из любопытства?
Brian D
@John, в моем случае уборка не помогает. Вы можете увидеть фактический список ошибок в этом потоке (на который еще не ответили): stackoverflow.com/questions/4928784/…
Android Eve
2

Android R.java - это автоматически сгенерированный файл AAPT (Android Asset Packaging Tool), который содержит идентификаторы ресурсов для всех ресурсов каталога res /. Если вы создаете какой-либо компонент в файле activity_main.xml, в этом файле автоматически создается идентификатор соответствующего компонента. Этот идентификатор можно использовать в исходном файле активности для выполнения любых действий с компонентом.

Сахил
источник