Ресурсы
Ресурс в приложении 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);
Get Resource URL and Content in Java
- Use the getResource() Function to Get Resource URL in Java
- Use getResourceAsStream() to Get Resource Content in Java
This tutorial will demonstrate how to get resource URLs and read resource files in Java with the getResource() function.
Use the getResource() Function to Get Resource URL in Java
We will use the getResource() method in Java to get the URL of three files: image.png , image1.png , resourcetext.txt .
We will pass resource URLs in strings in the body of the getResource() function. The function then searches for the given resource string and returns an object containing a URL.
getResource(String); public resource = yourclassname.getResource("Resource URL");
/*//you will learn how to get image URL in the following program //import statements */ import java.net.URL; import java.lang.*; public class getImageUrl public static void main(String[] args) throws Exception getImageUrl obj = new getImageUrl(); @SuppressWarnings("rawtypes") Class resource = obj.getClass(); URL imageurl = resource.getResource("/image.png"); System.out.println("Resource URL one is = " + imageurl); URL imageurl2 = resource.getResource("/image2.png"); System.out.println("Resource URL two is = " + imageurl2); URL texturl = resource.getResource("/textresource.txt"); System.out.println("Resource URL of the text file is = " + texturl); > >
Resource URL one is = file:/C:/Users/NAME/Desktop/JAVA/get%20resource%20url%20java/bin/image.png Resource URL two is = file:/C:/Users/NAME/Desktop/JAVA/get%20resource%20url%20java/bin/image2.png Resource URL of the text file is = file:/C:/Users/NAME/Desktop/JAVA/get%20resource%20url%20java/bin/textresource.txt
As we can see, we stored the three files in the string URL. Then we use the obj.getClass() method to get the main class that receives the image URL.
The function getResource() is the one that returns the URL.
Use getResourceAsStream() to Get Resource Content in Java
Java reserves a method called getResourceAsStream() to read files. The function returns an InputStream object containing the specified resource of the class.
For the example below, we will use getResourceAsStream() to read this file: /get resource URL java/src/readfile/GetResourceReadFile.java . And the string getresourcefromhere = «readfile/example.json»; is where we store the JSON file.
private InputStream getFileFromResourceAsStream(String getresourcefromhere) ClassLoader cL = getClass().getClassLoader(); InputStream inputStream = cL.getResourceAsStream(getresourcefromhere); return inputStream; >
Check out the following complete program if you have understood the basic syntax.
This program works on every platform. You should pay attention to the main class and file directory management.
//import necessary packages package readfile; import java.io.*; import java.nio.charset.StandardCharsets; //start function public class GetResourceReadFile private static final String String = null; public static void main(String[] args) throws IOException, Exception GetResourceReadFile app = new GetResourceReadFile(); //get resource file String getresourcefromhere = "readfile/example.json"; //use inputStream to return object containing resource InputStream getresourceandreadit = app.getFileFromResourceAsStream(getresourcefromhere); printInputStream(getresourceandreadit); > private InputStream getFileFromResourceAsStream(String getresourcefromhere) //load class ClassLoader cL = getClass().getClassLoader(); InputStream inputStream = cL.getResourceAsStream(getresourcefromhere); return inputStream; > private static void printInputStream(InputStream r) try (InputStreamReader sR = new InputStreamReader(r, StandardCharsets.UTF_8); BufferedReader R = new BufferedReader(sR)) String GOT_IT = String; //not necessary but will give you basic idea if (GOT_IT == String) //you can print multiple files while ((GOT_IT = R.readLine()) != null) //print file System.out.println(GOT_IT); > > > catch (IOException e) e.printStackTrace(); > > >
"File Name": "Demonstration File", "File Type": "JSON FILE", "File Reader": "getResource", "File creation date:": 2/18/2022, "Platform": "Langauge Type": "Programming", "Langugae Name": "JAVA", "Platform": "Oracle", "Importance": "Very High" >, "Development Environment": [ ] >
The whole program is the same as the previous example with URL. The only difference is the InputStream and ClassLoader cL = getClass().getClassLoader(); .
Sarwan Soomro is a freelance software engineer and an expert technical writer who loves writing and coding. He has 5 years of web development and 3 years of professional writing experience, and an MSs in computer science. In addition, he has numerous professional qualifications in the cloud, database, desktop, and online technologies. And has developed multi-technology programming guides for beginners and published many tech articles.