Основные компоненты приложения.

Ресурсы

  • Ресурсы - некоторые объекты принято держать некоторые объекты - изображения, строковые константы, цвета, анимацию, стили и т.п. за пределами исходного кода.
  • Система поддерживает хранение ресурсов в отдельных файлах.
  • Ресурсы легче поддерживать, обновлять, редактировать.
  • Каждое приложение на Android содержит каталог для ресурсов res и каталог для активов assets.

Ресурсы

  • Реальное различие между ресурсами и активами заключается в следующем:
  • Информация в каталоге ресурсов будет доступна в приложении через класс R, который автоматически генерируется средой разработки.
  • То есть хранение файлов и данных в ресурсах (в каталоге res) делает их легкодоступными для использования в коде программы.
  • Для чтения информации, помещённой в каталог активов assets (необработанный формат файла), необходимо использовать AssetManager для чтения файла как потока байтов.

Ресурсы

  • Android умеет динамически выбирать данные из дерева ресурсов, содержащие разные значения для разных конфигураций, языков и регионов.
  • При запуске Android автоматически загрузит нужный ресурс, не требуя ни одной строчки кода.
  • Ресурсы в Android являются декларативными.
  • В основном ресурсы хранятся в виде XML-файлов в каталоге res с подкаталогами values, drawable-ldpi, drawable-mdpi, drawable-hdpi, layout, но также бывают и другие типы ресурсов.

R class

  • Для удобства система создаёт идентификаторы ресурсов и использует их в файле R.java
  • класс R, который содержит ссылки на все ресурсы проекта
  • позволяет ссылаться на ресурсы внутри кода программы
  • Статический класс R генерируется на основе ваших заданных ресурсов и создаётся во время компиляции проекта.
  • При создании класс содержит статические подклассы для всех типов ресурсов, для которых был описан хотя бы один экземпляр.

Ресурсы

  • Так как файл R генерируется автоматически, то не смысла его редактировать вручную, потому что все изменения будут утеряны при повторной генерации.
  • В общем виде ресурсы представляют собой файл (например, изображение) или значение (например, заголовок программы), связанные с создаваемым приложением.
  • Удобств использования ресурсов заключается в том, что их можно изменять без повторной компиляции или новой разработки приложения.
  • Имена файлов для ресурсов должны состоять исключительно из букв в нижнем регистре, чисел и символов подчёркивания.

Ресурсы

  • Самыми распространёнными ресурсами являются строки (string), цвета (color) и графические рисунки (bitmap).
  • В приложении не рекомендуется применять жёстко написанные строки кода - вместо них следует использовать соответствующие идентификаторы, что позволяет изменять текст строкового ресурса, не изменяя исходного кода.
  • Первый подход создания: ресурсы задаются в файле, при этом имя файла значения не имеет.
  • Второй подход создания: ресурс задаётся в виде самого файла, и тогда имя файла уже имеет значение.

структура каталогов

/res/values/strings.xml
           /colors.xml
		   /dimens.xml
		   /attrs.xml
		   /styles.xml
	/drawable/*.png
             /*.jpg
             /*.gif
             /*.9.png
    /anim/*.xml
    /layout/*.xml
    /raw/*.*
    /xml/*.xml
/assets/*.*/*.*
				    
				    

Типы ресурсов

  • Цвета (res/values/имя_файла) - Идентификатор цвета, указывающий на цветовой код. ID таких ресурсов выражаются в R.java как R.color.*. XML-узел: /resources/color
  • Строки (res/values/имя_файла) - Строковые ресурсы.
  • В их число также входят строки в формате java и html. ID таких ресурсов выражаются в R.java как R.string.*.
  • XML-узел: resources/string.
  • Можно использовать дополнительное форматирование при помощи стандартных html-тегов b, i и u.
  • Методы, которые будут обрабатывать строковые ресурсы с HTML-форматированием, должны уметь обрабатывать эти теги.

Типы ресурсов

  • Меню (/res/menu/имя_файла) - Меню в приложении можно задать как XML-ресурсы.
  • Параметры (/res/values/имя_файла)
  • Представляет собой параметры или размеры различных элементов.
  • Поддерживает пиксели, дюймы, миллиметры, не зависящие от плотности экрана пиксели (dip) и пиксели, не зависящие от масштаба.
  • ID таких ресурсов выражаются в R.java как R.dimen.*. XML-узел: resources/dimen

Типы ресурсов

  • Изображения (/res/drawable/ваши_файлы) - Ресурсы-изображения.
  • Поддерживает форматы JPG, GIF, PNG (самый предпочтительный) и др.
  • Каждое изображение является отдельным файлом и получает собственный идентификатор, который формируется по имени файла без расширения.
  • Такие ID ресурсов представлены в файле R.java как R.drawable.*.
  • Система также поддерживает так называемые растягиваемые изображения (stretchable image), в которых можно менять масштаб отдельных элементов, а другие элементы оставлять без изменений.

Типы ресурсов

  • Отрисовываемые цвета - /res/values/ваш_файл или /res/drawable/ваши_файлы
  • Представляет цветные прямоугольники, которые используются в качестве фона основных отрисовываемых объектов, например точечных рисунков.
  • Поддержка такой функции обеспечивается тегом значения drawable, находящимся в подкаталоге значений.
  • Такие id ресурсов выражаются в файле R.java как R.drawable.*. ХМL-узел для такого файла: /resources/drawable.

Типы ресурсов

  • В Android при помощи специальных ХМL-файлов, расположенных в /res/drawable, также поддерживаются скруглённые и градиентные прямоугольники.
  • Корневым ХМL-тегом для drawable является .
  • Идентификаторы таких ресурсов выражаются в файле R.java как R.drawable.*.
  • В таком случае, каждое имя файла преобразуется в уникальный id отрисовываемого объекта

Типы ресурсов

  • Анимация (/res/anim/ваш_файл) - Android может выполнить простую анимацию на графике или на серии графических изображений.
  • Анимация включает вращения, постепенное изменение, перемещение и протяжение.
  • Произвольные XML-файлы (/res/xml/*.xml) - В Android в качестве ресурсов могут использоваться произвольные XML-файлы.
  • Они компилируются в aapt. Идентификаторы таких ресурсов также выражаются в файле R.java как R.xml.*

Типы ресурсов

  • Произвольные необработанные ресурсы (/res/raw/*.*) - Любые нескомпилированные двоичные или текстовые файлы, например, видео.
  • Каждый файл получает уникальный id ресурса. Идентификаторы таких ресурсов выражаются в файле R.java как R.raw.*

Типы ресурсов

  • Произвольные необработанные активы (/assets/*.*/*.*) - Можно использовать произвольные файлы в произвольно названных каталогах, которые находятся в подкаталоге /assets.
  • Это не ресурсы, а просто необработанные файлы.
  • В этом каталоге, в отличие от /res, подкаталоги могут располагаться на любой глубине.
  • Для таких файлов не создаются идентификаторы ресурсов.
  • При работе с ними нужно использовать относительное имя пути, начиная с /assets, но не указывая этого каталгоа в имени пути

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

  • Этот тип ресурсов формируется, как правило, автоматически
  • Когда вы размещаете новый элемент на форме, с которым будете взаимодействовать в программе, то ему нужно присвоить идентификатор.
  • Как правило, это происходит в виде @+id/editText (часто это происходит автоматически)
  • Знак плюса обозначает, что если идентификатора не существует, то его нужно создать в классе R.
  • В программе вы можете обращаться к элементу R.id.editText.

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

  • Но можно заранее создать ресурс типа item для задания id, не связанного ни с каким конкретным ресурсом:
  • <resources> 
        <item type="id" name="text"/> 
    </resources>					
    					
  • Здесь type описывает тип ресурса, в данном случае id.
  • Когда id будет установлен, будет работать и следующее определение View:
  • <TextView android:id="@id/textView"> 
    </TextView>					
    					
  • Обычно идентификаторы размещают в отдельном файле res/values/ids.xml.

Строковые ресурсы

  • Строковые ресурсы помогают упростить процесс создания локализованных версий.
  • Строковые ресурсы обозначаются тегом string.
  • <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="hello">Здравствуй, Мир!
        <string name="app_name">Hello, World
    </resources>					
    					
  • При создании или обновлении файла со строковыми ресурсами среда разработки автоматически создаёт или обновляет класс R.java
  • public static final int hello = 0x7f040000; 
    public static final int app_name = 0x7f040001;					
    					
  • можете использовать данные идентификаторы в своем исходном коде, используя следующий формат - R.string.hello.

Строковые ресурсы

  • сгенерированные ID указывают на int, а не на String.
  • Android при необходимости самостоятельно подставляет вместо int нужные строки.
  • Можно использовать несколько файлов
  • Главное, чтобы XML-файл имел необходимую структуру и находился в подкаталоге res/values.
  • Необходимо следить за уникальностью создаваемых имен.
  • Пробелы в начале и в конце строк обрезаются.
  • Если нужны пробелы, то разместите строку в кавычках и строка будет выводиться как есть.
  • Также можно использовать код \u0020 вместо пробела.

Виды строк

  • обычные строки
  • строки в кавычках
  • НТМL-строки
  • заменяемые строки
  • <resources>
        <string  name="simple_string">Простая строк</string>
        <string  name="quoted_ string">"Строка в кавычках<"/string> 
        <string  name="double_quoted_string">\"Строка в двойных кавычках\<"/string> 
        <string  name="java_format_string">Привет %2$s. Здравствуй %1$<s/string> 
        <string  name="tagged_string"><b>Рыжик</b> - <i>мой любимый кот</i></string> 
    </resources>					
    					

Некоторые особенности работы со строками

  • Нельзя использовать символы '&', '<'.
  • Сложный текст с проблемными символами можно поместить в особый контейнер CDATA
  • <string name="long_message">
    <![CDATA[
    <html>
    <body>
    <h1>Котик: {{birthDate}<}/h1>
    <p>Здесь текст о котиках:</p>
    <p>{{message}}</p>
    <p>Если хотите поговорить об этом, то обращайтесь к Котовскому.</p>
    </body>
    </html>
    ]]>
    </string>					
    					

Булевы ресурсы

  • Можно также хранить в ресурсах булевы значения true или false в файле с произвольным именем в папке res/values.
  • В файле с корневым элементом вы определяете элемент bool с нужным значением. У элемента есть атрибут name - строка, определяющая имя булевого ресурса.
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="autostart">true</bool>
    <bool name="sound">no</bool>
</resources>

Resources res = getResources();
boolean autostartSetting = res.getBoolean(R.bool.autostart);

<ImageView
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:adjustViewBounds="@bool/adjust_view_bounds" />

				    

Числовые ресурсы

  • В ресурсах можно хранить числа типа Integer. Хранить можно в произвольном имени XML-файла в папке res/values/ в корневом элементе
  • У элемента integer есть атрибут name, определяющий имя числового значения.
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <integer name="max_speed">75</integer>
   <integer name="min_speed">5</integer>
</resources>

Resources res = getResources();
int maxSpeed = res.getInteger(R.integer.max_speed);

				    

Ресурсы меню

  • Можно использовать как для описания обычного и контекстного меню.
  • Меню, описанное в формате XML, загружается в виде программного объекта с помощью метода inflate, принадлежащего сервису MenuInflater.
  • Как правило, это происходит внутри обработчика onCreateOptionsMenu
  • Описание меню хранится в отдельном файле в каталоге res/menu. Имена файлов без расширения автоматически становятся идентификаторами ресурсов.
  • В ХМL-файле меню есть три элемента:
  • menu — корневой элемент файла меню;
  • group — контейнерный элемент, определяющий группу меню;
  • item — элемент, определяющий пункт меню

Ресурсы разметки

  • ресурсы разметки, которые отвечают за внешний вид приложения.
  • Данные ресурсы представлены в формате XML.
  • Ресурс разметки формы (layout resource) - это ключевой тип ресурсов, применяемый при программировании пользовательских интерфейсов в Android.
  • Каждый ресурс, описывающий разметку, хранится в отдельном файле каталога res/layout. Имя файла без расширения выступает как идентификатор ресурса.
setContentView(R.layout.main);				    
				    

Ресурсы разметки

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>				    
				    

Цветовые ресурсы

  • Для работы со цветом используется тег color, а цвет указывается в специальных значениях.
  • #RGB;
  • #RRGGBB;
  • #ARGB;
  • #AARRGGBB;
  • Также существуют предопределенные названия цветов.
  • Такие ID доступны в пространстве имен android.R.соlor.
  • Посмотреть цветовые значения цветов можно в документации http://developer.android.com/reference/android/R.color.html.

Цветовые ресурсы

<?xml version="1.0" encoding="utf-8"?>
<resources>
   < color name="red">#f00</color>
   < color name="yellow">#FFFF00</color>
   < color name="green">#FF00FF00</color>
</resources>

int myRedColor = activity.getResourses.getColor(R.color.red); // получаем значение красного цвета
linearLayout.setBackgroundResource(R.color.yellow); // устанавливаем фон в желтый цвет
linearLayout.setBackgroundResource(android.R.color.holo_orange_dark); // устанавливаем фон в оранжевый цвет

				    

Ресурсы размеров

  • В Android используются следующие единицы измерения: пиксели, дюймы, точки.
  • Все они могут входит в состав ХМL-шаблонов и кода Jаvа.
  • Данные единицы измерения также можно использовать в качестве ресурсов при помощи тега (обычно используют файл dimens.xml)
<resources> 
<dimen name="in_pixels">1px</dimen> 
<dimen name="in_dp">5dp</dimen> 
<dimen name="in_sp">100sp</dimen>
</resources> 				    
				    

Использование необработанных ресурсов RAW

public void onClick(View view) {
    TextView infoTextView = findViewById(R.id.textViewInfo);
    infoTextView.setText(getStringFromRawFile(MainActivity.this));
}

private String  getStringFromRawFile(Activity activity) {
    Resources r = activity.getResources();
    InputStream is = r.openRawResource(R.raw.test);
    String myText = null;
    try {
        myText = convertStreamToString(is);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return  myText;
}

private String  convertStreamToString(InputStream is) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int i = is.read();
    while( i != -1)
    {
        baos.write(i);
        i = is.read();
    }
    return  baos.toString();
}				    
				    

Использование ресурсов в коде программы

  • Во время компиляции генерируется статический класс R на основе ваших ресурсов и содержит идентификаторы всех ресурсов в программе.
  • Класс R имеет несколько вложенных классов, один для каждого типа ресурса, поддерживаемого системой Android, и для которого в проекте существует файл ресурса
  • Класс R может содержать следующие вложенные классы:
  • R.anim — идентификаторы для файлов из каталога res/anim/ (анимация);
  • R.array — идентификаторы для файлов из каталога res/values/ (массивы);
  • R.bool — идентификаторы для битовых массивов в файлах arrays.xml из каталога res/values/;
  • R.integer — идентификаторы для целочисленных массивов в файлах arrays.xml из каталога res/values/;

Использование ресурсов в коде программы

  • R.color — идентификаторы для файлов colors.xml из каталога res/values/ (цвета);
  • R.dimen — идентификаторы для файлов dimens.xml из каталога res/values/ (размеры);
  • R.drawable — идентификаторы для файлов из каталога res/drawable/ (изображения);
  • R.id — идентификаторы представлений и групп представлений для файлов ХМL-разметки из каталога res/layout/;
  • R.layout — идентификаторы для файлов разметки из каталога res/layout/;
  • R.raw — идентификаторы для файлов из каталога res/raw/;
  • R.string — идентификаторы для файлов strings.xml из каталога res/values/ (строки);
  • R.style — идентификаторы для файлов styles.xml из каталога res/values/ (стили);
  • R.xml — идентификаторы для файлов из каталога res/xml/.