Работа с ресурсами

Последнее обновление: 30.10.2015

Ресурс в приложении Android представляет собой файл, например, файл разметки интерфейса или некоторое значение, например, заголовок окна. То есть ресурсы представляют собой и файлы разметки, и отдельные строки, и звуковые файлы, файлы изображений и т.д. Все ресурсы находятся в проекте в каталоге res. Для различных типов ресурсов, определенных в проекте, в каталоге res создаются подкаталоги. Поддерживаемые подкаталоги:

  • animator/: xml-файлы, определяющие анимацию свойств

  • anim/: xml-файлы, определяющие tween-анимацию

  • color/: xml-файлы, определяющие список цветов

  • drawable/: Графические файлы (.png, .jpg, .gif)

  • mipmap/: Графические файлы, используемые для иконок приложения под различные разрешения экранов

  • layout/: xml-файлы, определяющие пользовательский интерфейс

  • menu/: xml-файлы, определяющие меню приложения

  • raw/: различные файлы, которые сохраняются в исходном виде

  • values/: xml-файлы, которые содержат различные используемые в приложении значения, например, ресурсы строк

  • xml/: Произвольные xml-файлы

В общей сложности мы можем определить следующие типы ресурсов:

Ресурс

Каталог проекта

Файл

элемент в файле

Строки

/res/values/

strings.xml

<string>

Plurals

/res/values/

strings.xml

<plurals>

Массивы строк

/res/values/

strings.xml или arrays.xml

<string-array>

Логические значения Boolean

/res/values/

bools.xml

<bool>

Цвета

/res/values/

colors.xml

<color>

Список цветов

/res/color/

Произвольное название

<selector>

Размеры (Dimensions)

/res/values/

dimens.xml

<dimen>

Идентификаторы ID

/res/values/

ids.xml

<item>

Целые числа

/res/values/

integers.xml

<integer>

Массив целых чисел

/res/values/

integers.xml

<integer-array>

Графические файлы

/res/drawable/

Файлы с расширением jpg и png

-

Tween-анимация

/res/anim/

Файл xml с произвольным названием

<set>, <alpha>, <rotate>, <scale>, <translate>

Покадровая анимация

/res/drawable/

Файл xml с произвольным названием

<animation-list>

Анимация свойств

/res/animator/

Файл xml с произвольным названием

<set>, <objectAnimator>, <valueAnimator>

Меню

/res/menu/

Файл xml с произвольным названием

<menu>

XML-файлы

/res/xml/

Файл xml с произвольным названием

Бинарные и текстовые ресурсы

/res/raw/

Файлы мультимедиа (mp3, mp4), текстовые и другие файлы

Разметка графического интерфейса

/res/layout/

Файл xml с произвольным названием

Стили и темы

/res/values/

styles.xml, themes.xml

<style>

Существует два способа доступа к ресурсам: в файле исходного кода и в файле xml.

Ссылка на ресурсы в коде

Тип ресурса в данной записи ссылается на одно из пространств (внутренних классов), определенных в файле R.java, которые имеют соответствующие им типы в xml:

  • R.drawable (ему соответствует тип в xml drawable)

  • R.id (id)

  • R.layout (layout)

  • R.string (string)

  • R.attr (attr)

  • R.plural (plurals)

  • R.array (string-array)

Например, R.string.hello_world, где string - тип ресурса, а hello_world - имя ресурса.

Для получения ресурсов класс Activity имеет метод getResources(), который возвращает объект android.content.res.Resources. Например, в файле res/values/strings.xml определен ресурс hello_world:

<resources>
    <string name="app_name">IntentApp</string>

    <string name="hello_world">Hello world!</string>
</resources>

Получим этот ресурс в коде:

String hello = getResources().getString(R.string.hello_world);

Поскольку мы можем использовать самые разнообразные по типу ресурсы, то и класс Resources содержит соответствующий метод для работы с каждым из них. В данном случае чтобы получить строковый ресурс, применялся метод getString(), который принимал в качестве параметра идентификатор ресурса из класса R.

Другой пример. Допустим, у нас в приложении есть элемент ImageView, для которого надо установить изображение res/drawable/myimage.jpg, тогда можем написать так:

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

Для получения нужного нам ресурса мы передаем в качестве параметра в метод findViewById числовой идентификатор ресурса, а потом преобразуем его к нужному нам типу.

Доступ в файле xml

Ссылки на ресурсы имеют следующую формализованную форму: @[имя_пакета:]тип_ресурса/имя_ресурса

  • имя_пакета представляет имя пакета, в котором ресурс находится (указывать необязательно, если ресурс находится в том же пакете)

  • тип_ресурса представляет подкласс, определенный в классе R для типа ресурса

  • имя_ресурса имя файла ресурса без расширения или значение атрибута android:name в XML-элементе (для простых значений).

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage"  />

В данном случае атрибут android:text имеет в качестве значения ресурс строки @string/button_send.

Само определение ресурса @string/button_send, например, в файле strings.xml может выглядеть так: <string name="button_send">Отправить</string>

Знак + в записи EditText android:id="@+id/edit_message" означает, что если для элемента неопределен id со значением edit_message, то его следует определить.