Получение доступа к ресурсам приложения Android Печать
Добавил(а) microsin   

Перевод документации [1], в которой рассказывается о том, как использовать ресурсы в приложении Android в контексте получения к ним доступа. Все незнакомые сокращения и термины ищите в Словарике [5].

[Как получить доступ к ресурсам]

Как только предоставили ресурс в приложении (эта тема рассмотрена в [2]), Вы можете применить его, ссылаясь на ресурс по его идентификатору ресурса (resource ID). Все идентификаторы resource ID определены в Вашем классе R проекта, который автоматически генерирует утилита aapt.

Когда приложение компилируется, aapt генерирует класс R, который содержит идентификаторы resource ID для всех ресурсов, размещенных в директории res/. Для каждого типа ресурса здесь имеется подкласс R (например подкласс R.drawable предназначен для доступа ко всем рисуемым ресурсам), и для каждого типа ресурса поставлено в соответствие статическое целое число (например, R.drawable.icon). Это целое число и является resource, которые Вы можете использовать для получения доступа к ресурсу и его использования в программе.

Несмотря на то, что класс R то место, где указаны идентификаторы resource ID, Вам никогда не нужно заглядывать в него, чтобы определить resource ID для нужного ресурса. Все, что надо знать - это только символическое имя ресурса. Это имя для resource ID всегда составляется из следующих частей:

• Тип ресурса (resource type): каждый ресурс группируется с другими по своему типу, такому как string (строка), drawable (рисуемый ресурс) и layout (разметка интерфейса). Для получения дополнительной информации по типам ресурсов см. [3].

• Имя ресурса (resource name), которое может быть либо именем файла без расширения, либо значением XML-атрибута android:name attribute (если ресурс относится к простому значению, такому как строка или цвет).

Есть два способа получения доступа к ресурсу:

В коде Java: используя статическое целое число из субкласса Вашего класса R, например так:

R.string.hello

Здесь string является типом ресурса (resource type), и hello является именем ресурса (resource name). Имеется много функций Android API, которые могут получить доступ к ресурсам, когда Вы предоставите им в качестве аргумента resource ID в таком формате (см. далее раздел "Получение доступа к ресурсу в коде Java").

В XML: используя специальный синтаксис XML, который также соответствует resource ID, заданному в Вашем классе R, например так:

@string/hello

Здесь string также является resource type, и hello также является resource name. Вы можете использовать этот синтаксис в любом месте XML, где это значение ожидается (см. далее раздел "Получение доступа к ресурсу из XML").

[Получение доступа к ресурсу в коде Java]

Вы можете использовать ресурс в коде путем передачи resource ID методу (функции) как параметр. Например, Вы можете установить ImageView для использования ресурса картинки res/drawable/myimage.png, используя setImageResource():

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

Вы также можете запросить отдельные ресурсы с использованием методов в классе Resources, экземпляр которого можно получить вызовом getResources().

Вот общий синтаксис для ссылки на ресурс в коде:

[< package_name >.]R.< resource_type >.< resource_name >

< package_name > является именем пакета, в котором находится ресурс (эту часть указывать не требуется, если нужен доступ к ресурсам собственного пакета приложения).
< resource_type > R subclass для типа ресурса.
< resource_name > это либо имя файла ресурса без расширения, либо android:name значения атрибута в элементе XML (для простых значений ресурсов типа строк и цвета).

См. [3] для дополнительной информации по каждому типу ресурса, и как ссылаться на него.

Есть много методов, которые принимают resource ID как параметр, и Вы можете запросить ресурсы с использованием методов из класса Resources. Вы можете получить экземпляр этого класса вызовом Context.getResources(). Вот некоторые примеры получения доступа к ресурсам из кода:

// Загрузка фона (background) для текущего экрана из рисуемого ресурса.
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;
// Установка заголовка окна приложения (Activity title) путем запроса // строки из объекта Resources, потому что этот метод требует // CharSequence, а не resource ID. getWindow().setTitle(getResources().getText(R.string.main_title));
// Загрузка вручную созданной разметки экрана приложения (custom layout) // для текущего экрана приложения. setContentView(R.layout.main_screen);
// Установка слайдера в анимации путем получения Animation из объекта // Resources. mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in));
// Установка текста на объекте TextView, используя resource ID. TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello_message);

Предупреждение: не пытайтесь никогда вручную модифицировать файл модуля R.java, поскольку он генерируется автоматически утилитой aapt, когда Ваш проект компилируется. Так что любые сделанные вручную правки в этом файле будут безвозвратно потеряны при следующей компиляции.

[Получение доступа к ресурсу из XML]

Вы можете задавать значения для некоторых атрибутов и элементов XML, используя ссылку на существующий ресурс. Вы часто будете делать это при создании файлов разметки интерфейса (layout file), чтобы предоставить строки и картинки для Ваших виджетов в программе.

Например, если Вы добавите кнопку Button в разметку интерфейса (layout), Вы должны использовать строковый ресурс для текста кнопки:

< Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit" />

Примечание: можно конечно вместо ссылки вбить текст напрямую, но это будет плохой практикой, потому что усложнит локализацию приложения на разные языки [2].

Общий синтаксис для ссылки на ресурс в XML:

@[< package_name >:]< resource_type >/< resource_name >

< package_name > является именем пакета, в котором находится ресурс (эту часть указывать не требуется, если нужен доступ к ресурсам собственного пакета приложения).
< resource_type > R subclass для типа ресурса.
< resource_name > это либо имя файла ресурса без расширения, либо android:name значения атрибута в элементе XML (для простых значений ресурсов типа строк и цвета).

См. [3] для дополнительной информации по каждому типу ресурса, и как ссылаться на него.

В некоторых случаях нужно использовать ресурс в качестве значения в файле XML (например, чтобы применить картинку drawable к виджету), то Вы также можете использовать ресурс в XML в любом месте, которое подразумевает применение простого значения. Например, если у Вас есть следующий файл ресурса, который подключает ресурс цвета и строковый ресурс:

< ?xml version="1.0" encoding="utf-8"? >
< resources >
   < color name="opaque_red" >#f00< /color >
   < string name="hello" >Hello!< /string >
< /resources >

Вы можете использовать эти ресурсы в следующем файле разметки интерфейса (layout file) для установки строки текста и его цвета:

< ?xml version="1.0" encoding="utf-8"? >
< EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

В этом случае не нужно указывать имя пакета в ссылке на ресурс, потому что ресурс находится в том же пакете, что и само приложение. Чтобы обратиться к ресурсу системы, Вам нужно добавить в ссылку также и имя пакета, где находится ресурс, например:

< ?xml version="1.0" encoding="utf-8"? >
< EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@android:color/secondary_text_dark"
    android:text="@string/hello" />

Примечание: Вы всегда должны использовать ресурсы для строк, потому что это позволит легко локализовать приложение на другие языки - с помощью создания альтернативных строковых ресурсов, которые будут автоматически подгружаться в зависимости от текущих языковых установок системы. Для информации о том, как создавать альтернативные ресурсы (в том числе и строки локализации), см. [2] (раздел "Предоставление альтернативных ресурсов"). Для полного руководства по локализации Вашего приложения см. Localization.

Вы можете даже использовать ресурсы в XML, чтобы создать псевдонимы (aliases, алиасы). Несмотря на то, что создание алиасов на первый взгляд кажется избыточным, на самом деле это весьма полезно. Это нужно для того, чтобы не плодить одинаковые копии файлов, упростить поддержку проекта и экономить место в памяти (растровые картинки могут занимать много места). Например, Вы можете создать drawable-ресурс, который будет алиасом другого drawable-ресурса:

< ?xml version="1.0" encoding="utf-8"? >
< bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/other_drawable" />

Читайте больше про создание алиасов в [2], раздел "Создание псевдонимов ресурсов (resource alias)".

[Получения доступа к атрибутам стиля (style attribute)]

Ресурс атрибутов стиля позволяет Вам обращаться к значению атрибута в текущей примененной теме оформления интерфейса. Обращение к атрибуту стиля позволит Вам подстроить внешний вид элементов интерфейса пользователя (UI), чтобы они соответствовали стандартным вариациям оформления, которые действуют в текущей теме - вместо того, чтобы применять жестко закодированное значение. Ссылка на атрибут стиля по существу говорит: "используйте стиль, который определен этим атрибутом в текущей теме".

Чтобы сослаться на атрибут стиля, синтаксис имен почти идентичен нормальному формату ресурса, но вместо at-символа (@) используется знак вопроса (?), и указывать тип ресурса необязательно:

?[< package_name >:][< resource_type >/]< resource_name >

Например, здесь показано, как Вы можете сослаться на атрибут для установки цвета текста, чтобы он соответствовал "главному" цвету текста системной темы:

< EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

Здесь атрибут android:textColor задает имя атрибута стиля в текущей теме. Android теперь использует значение, которое применено к атрибуту стиля android:textColorSecondary в качестве величины для виджета редактирования текста android:textColor. Поскольку инструмент системного ресурса знает, что в этом контексте ожидается атрибут ресурса, Вам не нужно явно указывать тип (который может быть ?android:attr/textColorSecondary), и Вы можете исключить тип attr.

[Доступ к ресурсам платформы (Platform Resources)]

Android содержит некоторое количество стандартных ресурсов, таких как стили, темы, и разметки интерфейса (layouts). Чтобы получить доступ к этим ресурсам, указывайте в квалификаторе ссылки на ресурс имя пакета "android". Например, Android предоставляет layout-ресурс, который Вы можете использовать для элементов списка в ListAdapter:

setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray));

В этом примере simple_list_item_1 является layout-ресурсом, заданным платформой для всех элементов в ListView. Вы может использовать его вместо создания собственного layout для элементов списка. Для дополнительной информации см. руководство разработчика List View.

[Получение доступа к оригинальным файлам]

В редком случае Вам может понадобиться доступ к Вашим оригинальным файлам и директориям. Если это так, то сохранение Ваших файлов в папку res/ работать не будет, потому что единственным способом читать ресурсы из res/ является чтение через resource ID. Вместо этого для доступа к оригинальным файлам ресурсов Вам нужно сохранить их в директорию assets/.

Файлы, сохраненные в директории assets/, не получают resource ID, так что Вы не можете обратиться к ним через класс R или из ресурсов XML. Вместо этого Вы можете запросить файлы из директории assets/ почти так же, как это делается в обычной файловой системе, и читать данные файлов с использованием класса AssetManager.

Однако если Вам нужна возможность читать сырые данные raw (такие как файлы видео или аудио), то сохраните файл в директорию res/raw/, и читайте поток байт с использованием openRawResource().

[Ссылки]

1. Accessing Resources site:developer.android.com.
2. Предоставление ресурсов для приложения Android.
3. Типы ресурсов приложения Android.
4. AnimationDrawable: создание анимированной кнопки.
5. Словарик Android.