Доступ к ресурсам Android
Есть много вещей, используемых для создания превосходного Android-приложения. Помимо написания кода приложения, вам нужно уделить внимание различным ресурсам, таким как различные используемые статические материалы: растровые изображения, цвета, определения макетов, строки пользовательского интерфейса, анимации и т. д. Эти ресурсы обычно размещаются в отдельных подкаталогах в каталоге res/ проекта.
В этом руководстве вы узнаете, как организовывать ресурсы приложения, указывать альтернативные ресурсы и получать доступ к ним в приложении.
Организация ресурсов в Eclipse
Вам нужно поместить каждый ресурс в определенный подкаталог в каталоге res/ проекта. Например, вот иерархия файлов простого проекта:
MyProject/
src/
MyActivity.java
res/
drawable/
icon.png
layout/
activity_main.xml
info.xml
values/
strings.xml
Каталог res/ содержит все ресурсы в различных подкаталогах. Здесь есть один ресурс изображения, два ресурса макета и один файл строковых ресурсов. В таблице ниже подробно описаны ресурсы, поддерживаемые в каталоге res/ проекта.
| Каталог | Тип ресурса |
|---|---|
| anim/ | XML-файлы, определяющие свойства анимации. Они хранятся в папке res/anim/ и доступны через класс R.anim. |
| color/ | XML-файлы, определяющие списки состояний цвета. Они хранятся в папке res/color/ и доступны через класс R.color. |
| drawable/ | Файлы изображений, такие как .png, .jpg, .gif или XML-файлы, компилируются в растровые изображения, списки состояний, фигуры и анимированные изображения. Они хранятся в папке res/drawable/ и доступны через класс R.drawable. |
| layout/ | XML-файлы, определяющие макеты пользовательского интерфейса. Они хранятся в папке res/layout/ и доступны через класс R.layout. |
| menu/ | XML-файлы, определяющие меню приложения, такие как меню параметров, контекстные меню и подменю. Они хранятся в папке res/menu/ и доступны через класс R.menu. |
| raw/ | Произвольные файлы, сохраненные в исходной форме. Вам нужно открывать raw-файлы, вызывая Resources.openRawResource() на основе идентификатора ресурса с именем R.raw.filename. |
| values/ | XML-файлы, содержащие простые значения (такие как строки, целые числа, цвета и т. д.). Ниже приведены некоторые соглашения об именовании ресурсов в папках. arrays.xml представляет ресурсы массива, доступные через класс R.array; integers.xml представляет целочисленные ресурсы, доступные через класс R.integer; bools.xml представляет логические ресурсы, доступные через класс R.bool; colors.xml представляет цветовые ресурсы, доступные через класс R.color; dimens.xml представляет значения размеров, доступные через класс R.dimen; strings.xml представляет строковые ресурсы, доступные через класс R.string; styles.xml представляет ресурсы стилей, доступные через класс R.style. |
| xml/ | Вы можете прочитать любой XML-файл во время выполнения, вызвав Resources.getXML(). Здесь можно хранить различные файлы конфигурации, используемые во время выполнения. |
Альтернативные ресурсы
Ваше приложение должно обеспечивать поддержку альтернативных ресурсов для конкретных конфигураций устройств. Например, необходимо предоставить альтернативные графические ресурсы для разных разрешений экрана и альтернативные строковые ресурсы для разных языков. Во время выполнения Android определяет текущую конфигурацию устройства и загружает подходящие ресурсы для приложения.
Чтобы определить набор альтернативных ресурсов для конкретной конфигурации, выполните следующие шаги:
- Создайте новый каталог в res/ с именем в формате <resource_name>_<config_qualifier>. Здесь resources_name — это любой из ресурсов, упомянутых в таблице выше, например макеты, изображения и т. д. Квалификатор определяет, какие ресурсы используются для конкретной конфигурации. Полный список квалификаторов для разных типов ресурсов можно посмотреть в официальной документации.
- Сохраните соответствующие альтернативные ресурсы в этом каталоге. Эти файлы ресурсов должны иметь те же имена, что и файлы ресурсов по умолчанию, как показано в примере ниже; однако эти файлы заменят определённое содержимое. Например, хотя имена файлов изображений одинаковы, для экранов с высоким разрешением разрешение изображения также будет высоким.
Ниже приведён пример указания изображения экрана по умолчанию и альтернативного изображения высокого разрешения.
MyProject/
src/
main/
java/
MyActivity.java
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
layout/
activity_main.xml
info.xml
values/
strings.xml
Ниже приведён ещё один пример указания макета языка по умолчанию и альтернативного макета для арабского языка.
MyProject/
src/
main/
java/
MyActivity.java
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
layout/
activity_main.xml
info.xml
layout-ar/
main.xml
values/
strings.xml
Доступ к ресурсам
При разработке приложений вам нужно получать доступ к определённым ресурсам — как через код, так и через XML-файлы. В следующих разделах описано, как получать доступ к ресурсам в этих двух сценариях соответственно.
Доступ к ресурсам в коде
При компиляции Android-приложения создаётся класс R, содержащий идентификаторы для всех ресурсов в каталоге res/. Вы можете использовать класс R для доступа к ресурсам по подклассу + имени ресурса или напрямую по идентификатору ресурса.
Пример
Чтобы получить доступ к res/drawable/myimage.png и установить его в ImageView, используйте следующий код:
ImageView imageView = (ImageView) findViewById(R.id.myimageview); imageView.setImageResource(R.drawable.myimage);
Здесь первая строка кода использует R.id.myimageview, чтобы получить ImageView, определённый как myimageview в файле макета. Вторая строка использует R.drawable.myimage, чтобы получить изображение с именем myimage в подкаталоге drawable каталога res/.
Пример
Рассмотрим следующий пример, где res/values/strings.xml содержит следующее определение:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello, World!</string>
</resources>
Теперь вы можете использовать идентификатор ресурса, чтобы задать текст для объекта TextView с идентификатором msg следующим образом:
TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello);
Пример
Рассмотрим макет, определённый как res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>
Этот код приложения загрузит этот макет для активности в методе onCreate() следующим образом:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
}
Доступ в XML
Рассмотрим следующий XML-файл ресурсов res/values/strings.xml, который содержит ресурс цвета и строковый ресурс -
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources>
Теперь вы можете использовать эти ресурсы в приведённом ниже файле макета, чтобы задать цвет текста и текстовое содержимое:
<?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" />
Теперь, если вы снова вернётесь к примеру "Hello World!", объяснённому в предыдущей главе, я уверен, вы лучше поймёте все концепции из этого раздела. Поэтому я настоятельно рекомендую вернуться к предыдущим примерам и повторить базовое использование различных ресурсов, которые я использовал.
Другие расширения