Поиск по сайту

Ресурсы и волшебный R.java

вкл. . Опубликовано в Статьи


android


Ресурсы проекта и R.java очень близко связаны.

Ресурсы

Ресурсы - внешние файлы (не код), которые используются Вашим кодом, закомпилированы в Ваше приложение и встраиваются в него во время работы. Андроид поддерживает многие различные виды файлов ресурсов, включая XML, PNG и JPEG. Файлы XML имеют сильно различающиеся форматы в зависимости от того, что они описывают. Ресурсы описаны в исходном коде, и файлы XML откомпилированы в двоичный код для быстрой и эффективной загрузки. Строки сжаты в более форму, более экономящую память.

Список ресурсов

Типы ресурсов и их местоположение:

- layout-файлы - “/res/layout/” .

- изображения - “/res/drawable/” .

- анимация - “/res/anim/” .

- стили, строки и массивы - “/res/values/” .

          - Названия не могут отличаться:

          - ‘arrays.xml’ для определения массивов.

          - ‘colors.xml’ для определения цветов.

               - #RGB, #ARGB, #RRGGBB, #AARRGGBB

          - ‘dimens.xml’ для определения размеров (dimensions).

          - ‘strings.xml’ для определения строк.

          - ‘styles.xml’ для определения стилей объектов.

- необработанные файлы вроде mp3 или видео - “/res/raw/”

Использование ресурсов в коде

Для использования ресурса в коде нужно знать только полный ID ресурса и в какой тип объекта Ваш ресурс был откомпилирован. Вот синтаксис обращения к ресурсу:

R.resource_type.resource_nameт  или  android.R.resource_type.resource_name

resource_type - подкласс R, который содержит определенный тип ресурса. resource_name - атрибут ресурсов, определенный в файлах XML, или имя файла (без расширения) для ресурса, определенных другими типами файла. Каждый тип ресурса будет добавлен в подкласс R, в зависимости от его типа.

Ресурсы, откомпилированные Вашим приложением, могут быть использованы без названия пакета (просто как R.resource_type.resource_name). Андроид содержит многие стандартные ресурсы, такие как стили экрана и фоны кнопки. Обращаться к ним в коде Вы можете через android.R.resource_type.resource_name, для примера: android.R.drawable.button_background.

Ссылка на Ресурсы

Значение в атрибуте или ресурсе может также быть ссылкой на другой ресурс. Это часто используется в layout файлах, чтобы хранить строки (таким образом можно локализовать приложение) и изображения (находящиеся в другом файле), хотя ссылка может быть на любой тип ресурса, включая цвета и числа.

Например, если у нас есть ресурсы с цветами, мы можем написать layout файл, который установит  цвет текста на значение, содержащееся в одном из ресурсов:

<EditText

          android:layout_width="fill_parent"

          android:layout_height="fill_parent"

          android:textColor="@color/opaque_red"

          android:text="Hello, World!" />

Обратите внимание на префикс "@", показывающий, что это - ссылка на ресурс, текст после него - название ресурса в форме @[пакет:]тип/имя. В примере мы не  определяем пакет, потому что ссылаемся на ресурс в нашем собственном пакете. Чтобы сослаться на системный ресурс, Вы должны были бы написать:

<EditText

          android:layout_width="fill_parent"

          android:layout_height="fill_parent"

          android:textColor="@android:color/opaque_red"

          android:text="Hello, World!" />

В следующем примере, мы используем ссылку на ресурс, храня строки в layout файле так, чтобы они могли быть локализованы:

<EditText

          android:layout_width="fill_parent"

          android:layout_height="fill_parent"

          android:textColor="@android:color/opaque_red"

          android:text="@string/hello_world" />

Альтернативные Ресурсы & Локализация

Альтернативные Ресурсы и Локализация - серьезная проблема, достаточно хорошо решенная в Андроиде. Обычно чаще всего Вы должны были бы проектировать UI, хорошо подходящий для каждого из возможных разрешений экрана одновременно, что почти невозможно.

Вы можете добавлять в свое приложение различные UI, языки или поддержку устройств с различной конфигурацией харда.

Заметьте, что даже если Вы добавите много разных языков, UI и  всех других ресурсов, SDK сам определит набор ресурсов, который будет использоваться. К примеру, Андроид сам догадается, где какой язык Вам нужен и выберет его. Или UI. Чтобы включать дополнительные ресурсы, создайте параллельные папки с ресурсами и к каждому названию через черточку добавьте параметр (спецификатор), куда эта папка относится (язык, ориентация экрана, точки на дюйм, разрешение, …). Вот, например, у этого проекта есть английская и немецкая локализация (здесь только строки):

MyApp/

          res/

               values-en/

                        strings.xml

               values-de/

                        strings.xml

Андроид поддерживает несколько типов спецификаторов, с различными значениями для каждого. Добавьте их концу названия папки ресурса, отделив от названия черточкой. Вы можете добавить много спецификаторов, отделяя их друг от друга черточками. Например, папка, содержащая drawable ресурсы только для определенной конфигурации:

MyApp/

      res/

            drawable-en-rUS-port-92dpi-finger-keyshidden-12key-dpad-480x320/

Более того, Вы можете определить только несколько определенных опций конфигурации, для которых определен ресурс.

MyApp/

          res/

                drawable-en-rUS-finger/

                drawable-port/

                drawable-port-160dpi/

               drawable-qwerty/

Андроид выберет, какой из различных основных файлов ресурса подходит лучше всего во время выполнения, в зависимости от текущей конфигурации устройства.

Волшебный R.java

R.java проекта - автоматически сгенерированный файл, индексирующий все ресурсы Вашего проекта. Вы используете этот класс в своем исходном тексте как своего рода способ обратиться к ресурсам, которые Вы включили в свой проект. Это особенно важно, учитывая особенности интегрированных сред разработки, потому что позволяет Вам быстро и в интерактивном режиме определять местонахождение определенной информации, которую Вы ищете. Дополнительно во время компиляции Вы получаете уверенность, что ресурс, который Вы хотите использовать, действительно существует.