Ресурсы
Ресурс в приложении 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, который содержат элемент
В общей сложности мы можем определить следующие типы ресурсов:
Логические значения Boolean
Файлы с расширением jpg и png
Файл xml с произвольным названием
Файл xml с произвольным названием
Файл xml с произвольным названием
Файл xml с произвольным названием
Файл xml с произвольным названием
Бинарные и текстовые ресурсы
Файлы мультимедиа (mp3, mp4), текстовые и другие файлы
Разметка графического интерфейса
Файл xml с произвольным названием
К примеру, если мы возьмем стандартный проект 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:
Этот ресурс ссылается на строку. Чтобы получить ссылку на данный ресурс в коде java, мы можем использовать выражение R.string.app_name .
Доступ в файле xml
Нередко возникает необходимость ссылаться на ресурс в файле xml, например, в файле, который определяет визуальный интерфейс, к примеру, в activity_main.xml. Ссылки на ресурсы в файлах xml имеют следующую формализованную форму: @[имя_пакета:]тип_ресурса/имя_ресурса
- имя_пакета представляет имя пакета, в котором ресурс находится (указывать необязательно, если ресурс находится в том же пакете)
- тип_ресурса представляет подкласс, определенный в классе R для типа ресурса
- имя_ресурса имя файла ресурса без расширения или значение атрибута android:name в XML-элементе (для простых значений).
Например, мы хотим вывести в элемент TextView строку, которая определена в виде ресурса в файле strings.xml:
В данном случае свойство 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 в качестве источника ресурсов, который в моем случае выглядит так:
И изменим код 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);
Java — чтение файла из папки ресурсов
В этом уроке мы покажем вам, как читать файл из resources папка или classpath, как во время выполнения, так и в среде модульного тестирования. Попробуйте положить файл в src/main/resources и прочитайте файл со следующими фрагментами кода:
File file = new File( getClass().getClassLoader().getResource("database.properties").getFile() );
InputStream inputStream = getClass() .getClassLoader().getResourceAsStream("database.properties");
Заметка
Вы можете заинтересовать этот getResourceAsStream в статическом методе
1. Каталог проектов
Просмотрите структуру проекта Maven.
2. Считайте файл из папки ресурсов
SRC / основные / ресурсы / database.properties
datasource.url=jdbc:mysql:// локальный / mkyong? UseSSL = ложь datasource.username=root datasource.password=password datasource.driver-class-name=com.mysql.jdbc.Driver
Читать database.properties файл и распечатать содержимое.
package com.mkyong; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.net.URL; public class Application < public static void main(String[] args) throws IOException < Application main = new Application(); File file = main.getFileFromResources("database.properties"); printFile(file); >// получить файл из classpath, папки ресурсов private File getFileFromResources(String fileName) < ClassLoader classLoader = getClass().getClassLoader(); URL resource = classLoader.getResource(fileName); if (resource == null) < throw new IllegalArgumentException("file is not found!"); >else < return new File(resource.getFile()); >> private static void printFile(File file) throws IOException < if (file == null) return; try (FileReader reader = new FileReader(file); BufferedReader br = new BufferedReader(reader)) < String line; while ((line = br.readLine()) != null) < System.out.println(line); >> > >
datasource.url=jdbc:mysql:// локальный / mkyong? UseSSL = ложь datasource.username=root datasource.password=password datasource.driver-class-name=com.mysql.jdbc.Driver
3. Модульный тест
SRC / тест / ресурсы / XML / data.xml
Читать data.xml и распечатать содержимое.