Android: что такое R? Почему это так Cryptic?

Я пытаюсь дублировать образец примера NotePad таким образом, что если я буду возиться с исходными файлами, чтобы учиться на экспериментах, исходные файлы примеров не будут затронуты.

Увы, несмотря на следующие очень чистые шаги в нетронутой среде, R обратился против меня, снова!

Я получил около 20 " R не может быть разрешен переменной" errors...

Теперь это похоже на catch 22: Я пытаюсь изучить образец NotePad, так что у меня есть шанс понять, что такое R. Но R мне не очень нравится, так что это не дает мне возможности изучить образец NotePad.

Чтобы добавить оскорбление к травме, когда я Google для R, я получаю совершенно несущественные результаты.

  • Что такое R?
  • Почему это так Cryptic?
  • Почему это всегда первое, что не может быть разрешено?

Обновление: я заметил, что в проекте HelloAndroid (версия макета XML) есть файл сгенерированный Java, названный R.java. Это печально известный R, о котором жалуется разработчик проекта?

Ответ 1

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

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

Обычно существуют два R класса, с которыми вы будете иметь дело

  • Рамочные ресурсы в android.R и
  • Ваш собственный в вашем пространстве имен

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

Ответ 2

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

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

Почему это так загадочно: Его легко путать, потому что R автоматически генерируется ant. Его загадочный, потому что вы не должны "касаться" его вручную (конечно, вы можете, но ваши изменения автоматически стираются при регенерации). Кроме того, он загадочен, потому что иногда eclipse автоматически импортирует androids стандартный файл R (как описано в ответах выше)

Почему это всегда первый, который не может быть разрешен: 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/folder в eclipse (представление пакетов). Вы увидите один пакет, указанный там, он будет иметь имя, указанное вами в манифесте. Попробуйте удалить его, он вернется, если все ваши ресурсы следуют правильным правилам именования, и все ваши xml файлы следуют правильным правилам xml, и если сборка автоматически включена в eclipse.

Ключом к пониманию файла R является понимание того, что он находится в том же пакете, что и другие классы, даже если он находится в другом каталоге, а затем другие файлы, принадлежащие вашему "основному" пакету. После того, как вы это понимаете и понимаете синтаксис и имена файлов ресурсов, устранение неполадок с R легко.

Ответ 3

R - это имя для ваших ресурсов. Любой ресурс, к которому вы обращаетесь к вам через R.$FOLDER.$RESOURCE или что-то очень похожее. Если он не может быть разрешен, убедитесь, что путь правильный, и ресурс, на который имеется ссылка, (с учетом регистра; включает расширение). Кроме того, запутанная часть (для меня в любом случае) заключается в том, что есть два разных R.. Если вы получаете много ошибок "Не удалось решить", попробуйте увидеть, что вы импортирование. Попробуйте изменить или удалить его. Или вы можете попробовать очистить свой проект (ПРЕДУПРЕЖДЕНИЕ: Иногда это делает вещи хуже, чем они есть).