Ресурсы

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

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

Ресурс в приложении 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 Studio

По умолчанию здесь есть каталоги не для всех типов ресурсов, которые использоваться в 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

Нередко возникает необходимость ссылаться на ресурс в файле 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.

Метод getResources

Для получения ресурсов в классе 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() получаем все ресурсы и затем используем их для устаноки значений свойств графических элементов. При запуске приложения мы увидим применение полученных ресурсов:

Использование ресурсов в Android Studio

Подобным образом мы можем программно получать и другие ресурсы и использоват их в приложении. Однако следует отметить, что в данном случае нам не нужно использовать метод getResources() и вообще производить какие-то определенные действия по получению ресурса, поскольку метод setText() класса TextView поддерживает прямую установку текста по идентификатору ресурса:

textView.setText(R.string.app_name);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850