Доступ к ресурсам 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!", объяснённому в предыдущей главе, я уверен, вы лучше поймёте все концепции из этого раздела. Поэтому я настоятельно рекомендую вернуться к предыдущим примерам и повторить базовое использование различных ресурсов, которые я использовал.

Другие расширения