Ресурс в приложении Android представляет собой файл, например, файл разметки интерфейса или некоторое значение, например, простую строку. То есть ресурсы представляют собой и файлы разметки, и отдельные строки, и звуковые файлы, файлы изображений и т.д. Все ресурсы находятся в проекте в каталоге res. Для различных типов ресурсов, определенных в проекте, в каталоге res создаются подкаталоги. Поддерживаемые подкаталоги:
animator/: xml-файлы, определяющие анимацию свойств
anim/: xml-файлы, определяющие tween-анимацию
color/: xml-файлы, определяющие список цветов
drawable/: Графические файлы (.png, .jpg, .gif)
mipmap/: Графические файлы, используемые для иконок приложения под различные разрешения экранов
layout/: xml-файлы, определяющие пользовательский интерфейс приложения
menu/: xml-файлы, определяющие меню приложения
raw/: различные файлы, которые сохраняются в исходном виде
values/: xml-файлы, которые содержат различные используемые в приложении значения, например, ресурсы строк
xml/: Произвольные xml-файлы
font/: файлы с определениями шрифтом и расширениями .ttf, .otf или .ttc, либо файлы XML,
который содержат элемент <font-family>
В общей сложности мы можем определить следующие типы ресурсов:
Ресурс | Каталог проекта | Файл | элемент в файле |
Строки | /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> |
К примеру, если мы возьмем стандартный проект Android Studio, который создается по умолчанию, то там можем заметить наличие уже нескольких папок для различных ресурсов в каталоге res:
По умолчанию здесь есть каталоги не для всех типов ресурсов, которые использоваться в Android, однако при необходимости мы можем добавить в папку res нужный каталог, а в него затем поместить ресурс.
Когда происходит компиляция проекта сведения обо всех ресурсах добавляются в специальный файл R.jar, который затем используется при работе с ресурсами
Существует два способа доступа к ресурсам: в файле исходного кода и в файле 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
)
Например, для установки ресурса activity_main.xml в качестве графического интерфейса в коде MainActivity в методе onCreate()
есть такая строка:
setContentView(R.layout.activity_main);
Через выражение R.layout.activity_main
мы и ссылаемся на ресурс activity_main.xml, где layout
- тип ресурса, а activity_main
- имя ресурса.
Подобным образом мы можем получать другие ресурсы. Например, в файле res/values/strings.xml определен ресурс app_name:
<resources> <string name="app_name">ViewApp</string> </resources>
Этот ресурс ссылается на строку. Чтобы получить ссылку на данный ресурс в коде java, мы можем использовать выражение R.string.app_name
.
Нередко возникает необходимость ссылаться на ресурс в файле xml, например, в файле, который определяет визуальный интерфейс, к примеру, в
activity_main.xml. Ссылки на ресурсы в файлах xml имеют следующую формализованную форму: @[имя_пакета:]тип_ресурса/имя_ресурса
имя_пакета
представляет имя пакета, в котором ресурс находится (указывать необязательно, если ресурс находится в том же пакете)
тип_ресурса
представляет подкласс, определенный в классе R
для типа ресурса
имя_ресурса
имя файла ресурса без расширения или значение атрибута android:name
в XML-элементе
(для простых значений).
Например, мы хотим вывести в элемент TextView строку, которая определена в виде ресурса в файле strings.xml:
<TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" />
В данном случае свойство text
в качестве значения будет получать значение строкового ресурса app_name.
Для получения ресурсов в классе Activity мы можем использовать метод getResources(), который возвращает объект android.content.res.Resources. Но чтобы получить сам ресурс, нам надо у полученного объекта Resources вызвать один из методов. Некоторые из его методов:
getString(): возвращает строку из файла strings.xml по числовому идентификатору
getDimension(): возвращает числовое значение - ресурс dimen
getDrawable(): возвращает графический файл в виде объекта Drawable
getBoolean(): возвращает значение boolean
getColor(): возвращает определение цвета
getColorStateList(): возвращает объект ColorStateList - набор цветов
getFont(): возвращает определение шрифта в виде объекта Typeface
getFloat(): возвращает значение float
getLayout(): возвращает объект XmlResourceParser, связанный с файлом layout
Это только некоторые методы. Но все они в качестве параметра принимают идентификатор ресурса, который надо получить. Вкратце рассмотрим их применение. Возьмем тот же файл res/values/strings.xml в качестве источника ресурсов, который в моем случае выглядит так:
<resources> <string name="app_name">ViewApp</string> </resources>
И изменим код MainActivity:
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); // получение ресурсов из файла values/strings.xml String app_name = getResources().getString(R.string.app_name); TextView textView = new TextView(this); textView.setTextSize(30); textView.setText(app_name); setContentView(textView); } }
Здесь, используя метод getResources()
получаем все ресурсы и затем используем их для устаноки значений свойств графических
элементов. При запуске приложения мы увидим применение полученных ресурсов:
Подобным образом мы можем программно получать и другие ресурсы и использоват их в приложении.
Однако следует отметить, что в данном случае нам не нужно использовать метод getResources()
и вообще производить какие-то определенные действия по получению ресурса,
поскольку метод setText()
класса TextView поддерживает прямую установку текста по идентификатору ресурса:
textView.setText(R.string.app_name);