В каком файле находятся все идентификаторы ресурсов

Обновлено: 07.07.2024

Android -приложения могут быть простыми и сложными, но строение приложений всегда будет одинаковым. Есть обязательные элементы приложений, а есть опциональные, которые используются по мере необходимости. Android - приложение состоит из нескольких основных компонентов: манифест приложения, набор различных ресурсов и исходный код программы .

Следующая таблица демонстрирует обязательные и возможные составляющие структуры Android -приложения:

1.5.1. Файл манифеста AndroidManifest.xml

Файл манифеста AndroidManifest.xml предоставляет системе основную информацию о программе. Каждое приложение должно иметь свой файл AndroidManifest.xml. Редактировать файл манифеста можно вручную, изменяя XML-код или через визуальный редактор Manifest Editor, который позволяет осуществлять визуальное и текстовое редактирование файла манифеста приложения.

  • описывает компоненты приложения – Activities, Services, Broadcast receivers и Content providers;
  • содержит список необходимых разрешений для обращения к защищенным частям API и взаимодействия с другими приложениями;
  • объявляет разрешения, которые сторонние приложения обязаны иметь для взаимодействия с компонентами данного приложения;
  • объявляет минимальный уровень API Android, необходимый для работы приложения;
  • перечисляет связанные библиотеки.

Корневым элементом манифеста является <manifest> . Помимо данного элемента обязательными элементами являются теги <application> и <uses-sdk>. Элемент <application> является основным элементом манифеста и содержит множество дочерних элементов, определяющих структуру и работу приложения. Порядок расположения элементов, находящихся на одном уровне, произвольный. Все значения устанавливаются через атрибуты элементов. Кроме обязательных элементов, упомянутых выше, в манифесте по мере необходимости используются другие элементы. Перечислим некоторые из них:

  • <manifest> является корневым элементом манифеста.

По умолчанию Eclipse создает элемент с четырьмя атрибутами:

xmlns:android определяет пространство имен Android.

package определяет уникальное имя пакета приложения.

android:versionCode указывает на внутренний номер версии.

android:versionName указывает номер пользовательской версии.

Наиболее распространненные разрешения:

INTERNET – доступ к интернету

READ_CONTACTS – чтение (но не запись) данных из адресной книги пользователя

WRITE_CONTACTS – запись (но не чтение) данных в адресную книгу пользователя

RECEIVE_SMS – обработка входящих SMS

ACCESS_FINE_LOCATION – точное определение местонахождения при помощи GPS

android:minSdkVersion определяет минимальный уровень API, требуемый для работы приложения. Система Android будет препятствовать тому, чтобы пользователь установил приложение, если уровень API системы будет ниже, чем значение, определенное в этом атрибуте.

android:maxSDKVersion позволяет определить самую позднюю версию, которую готова поддерживать программа.

targetSDKVersion позволяет указать платформу, для которой разрабатывалось и тестировалось приложение.

android.hardware.camera – требуется аппаратная камера.

android.hardware.camera.autofocus – требуется камера с автоматической фокусировкой.

1.5.2. Ресурсы

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

В основном, ресурсы хранятся в виде XML-файлов в каталоге res с подкаталогами values, drawable-ldpi, drawable-mdpi, drawable-hdpi, layout. Но также бывают еще два типа ресурсов: raw и assets.

Для удобства система создает идентификаторы ресурсов и использует их в файле R.java (класс R, который содержит ссылки на все ресурсы проекта), что позволяет ссылаться на ресурсы внутри кода программы. Статический класс R генерируется на основе заданных ресурсов и создается во время компиляции проекта. Так как файл R генерируется автоматически, то нет смысла его редактировать вручную, потому что все изменения будут утеряны при повторной генерации.

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

Самыми распространенными ресурсами являются, пожалуй, строки (string), цвета (color) и графические рисунки (bitmap).

В следующей таблице перечислены основные ресурсы Android-приложения:

Помимо изображений в каталоге res/drawable могут храниться ресурсы простых геометрических фигур. Вот лишь некоторые из возможных атрибутов:

  • android:shape задает тип фигуры: rectangle (прямоугольник), oval (овал), line (линия), ring (окружность);
  • <corners> создает закругленные углы для прямоугольника;
  • <gradient> задает градиентную заливку для фигуры; в Android можно создавать три типа градиентов: Linear (линейный), Radial (радиальный) и Sweep (разверточный);
  • <size> задает размеры фигуры;
  • <solid> задает сплошной цвет для фигуры.

Анимация в Android бывает двух видов:

  • Frame Animation – кадровая анимация, традиционная анимация при помощи быстрой смены последовательных изображений, как на кинопленке.
  • Tween Animation – анимация преобразований может выполняться в виде ряда простых преобразований: изменение позиции (класс TranslateAnimation), размера (ScaleAnimation), угла вращения (RotateAnimation) и уровня прозрачности (AlphaAnimation). Команды анимации определяют преобразования, которые необходимо произвести над объектом. Преобразования могут быть последовательными или одновременными. Последовательность команд анимации определяется в XML-файле (предпочтительно) или в программном коде.

В Android имеется еще один каталог, в котором моrут храниться файлы, предназначенные для включения в пакет – /assets . Это не ресурсы, а просто необработанные файлы. Этот каталог находится на том же уровне, что и /res. Для файлов, располагающихся в /assets, в R.java не генерируются идентификаторы ресурсов. Для их считывания необходимо указать путь к файлу. Путь к файлу является относительным и начинается с /assets. Этот каталог, в отличие от подкаталога res/, позволяет задавать произвольную глубину подкаталогов и произвольные имена файлов.

1.5.3. Разметка

В Android-приложениях, пользовательский интерфейс построен на View и ViewGroup объектах. Класс ViewGroup является основой для подкласса Layout (разметка).

Разметка (также используются термины компоновка или макет) хранится в виде XML-файла в папке /res/layout . Это сделано для того, чтобы отделить код от дизайна, как это принято во многих технологиях (HTML и CSS, Visual Studio и Expression Blend). Кроме основной компоновки для всего экрана, существуют дочерние компоновки для группы элементов. По сути, компоновка – это некий визуальный шаблон для пользовательского интерфейса приложения, который позволяет управлять элементами, их свойствами и расположением. В своей практике вам придется познакомиться со всеми способами размещения.

Android-плагин для Eclipse включает в себя специальный редактор для создания разметки двумя способами. Редактор имеет две вкладки: одна позволяет увидеть, как будут отображаться элементы управления, а вторая – создавать XML-разметку вручную.

Создавая пользовательский интерфейс в XML-файле, можно отделить дизайн приложения от программного кода. Можно изменять пользовательский интерфейс в файле разметки без необходимости изменения программного кода. Например, можно создавать XML-разметки для различных ориентаций экрана мобильного устройства (portrait, landscape), размеров экрана и языков интерфейса. Впрочем, элементы интерфейса можно создавать и программно, когда это необходимо.

Каждый файл разметки должен содержать только один корневой элемент компоновки, который должен быть объектом View или ViewGroup. Внутри корневого элемента можно добавлять дополнительные объекты разметки или дочерние элементы интерфейса, чтобы постепенно формировать иерархию элементов, которую определяет создаваемая разметка.

Существует несколько стандартных типов разметок:

  • FrameLayout является самым простым типом разметки. Обычно это пустое пространство на экране, которое можно заполнить только дочерним объектом View или ViewGroup . Все дочерние элементы FrameLayout прикрепляются к верхнему левому углу экрана. В разметке FrameLayout нельзя определить различное местоположение для дочернего объекта View. Последующие дочерние объекты View будут просто рисоваться поверх предыдущих представлений, частично или полностью затеняя их, если находящийся сверху объект непрозрачен
  • LinearLayout выравнивает все дочерние объекты в одном направлении – вертикально или горизонтально. Направление задается при помощи атрибута ориентации android:orientation . Все дочерние элементы помещаются в стек один за другим, так что вертикальный список представлений будет иметь только один дочерний элемент в строке независимо от того, насколько широким он является. Горизонтальное расположение списка будет размещать элементы в одну строку с высотой, равной высоте самого высокого дочернего элемента списка.
  • TableLayout позиционирует свои дочерние элементы в строки и столбцы. TableLayout не отображает линии обрамления для рядов, столбцов или ячеек. TableLayout может иметь ряды с разным количеством ячеек. При формировании разметки таблицы некоторые ячейки при необходимости можно оставлять пустыми. TableLayout удобно использовать, например, при создании логических игр типа Судоку, Крестики-Нолики и тому подобных.
  • RelativeLayout позволяет дочерним элементам определять свою позицию относительно родительского представления или относительно соседних дочерних элементов.

Все описываемые разметки являются подклассами ViewGroup и наследуют свойства, определенные в классе View.

Разметки ведут себя как элементы управления, и их можно группировать. Расположение элементов управления может быть вложенным. Например, можно использовать RelativeLayout в LinearLayout и так далее. Однако, слишком большая вложенность элементов управления вызывает проблемы с производительностью.

В подпапках res хранятся различные ресурсы приложения. Мы уже отлично знаем про layout-файлы в папке res/layout. Я упоминал про папку res/drawable с density-суффиксами – в ней хранятся картинки. Теперь обратим внимание на папку res/values. Она предназначена для хранения ресурсов (констант) различных типов. Мы рассмотрим типы String и Color.

Project name: P0111_ResValues
Build Target: Android 2.3.3
Application name: ResValues
Package name: ru.startandroid.develop.resvalues
Create Activity: MainActivity

Откроем файл res/values/strings.xml


Мы видим два элемента типа String:

hello – по умолчанию он использован в свойстве Text в TextView в main.xml. И соответственно TextView отображает значение этого элемента.


app_name – по умолчанию используется как заголовок для приложения и Activity. Это указывается в манифест-файле, который мы еще не разбирали.

На эти элементы можно кликнуть и увидеть справа, что они собой представляют: имя (Name) и значение (Value)


Name – это ID. Оно должно быть уникальным, и для него в R.java создается константа, чтобы мы могли иметь доступ к этому String-элементу.


Если мы посмотрим XML-содержимое файла strings.xml (вкладка снизу – аналогично как для main.xml), то видим, что там все прозрачно и просто. Попробуем и мы использовать ресурсы.

Для начала создадим такой экран в main.xml:

Экран разделен на две одинаковые половины, содержащие LinearLayout, Button и TextView. Для LinearLayout мы укажем фоновый цвет, а для TextView и Button – изменим текст. Реализуем это с помощью ресурсов. Причем View-элементы верхней части мы будем настраивать вручную через properties, а нижнюю часть попробуем настроить программно.

Давайте создадим свой файл с ресурсами в папке values, название пусть будет myres.



После создания открылся редактор файла. Добавлять элемент просто – жмем кнопку Add и выбираем тип, а справа пишем имя и значение. Создадим 4 String-элемента и 2 Color-элемента:

Для практики можете создать вручную, а можете просто вставить этот текст в содержимое myres.xml. Не забудьте сохранить. Заглянем в R.java, убедимся, что здесь все появилось:


Ок, ресурсы созданы, настроим View-элементы на их использование. Сначала верхние:

llTop – в Properties находим свойство Background, жмем кнопку выбора (три точки), в ветке Color выделяем llTopColor и жмем OK


tvTop – для свойства Text откройте окно выбора и найдите там tvTopText.

btnTop - для свойства Text откройте окно выбора и найдите там btnTopText.

Цвет верхней части изменился и тексты поменялись на те, что мы указывали в myres.xml.

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

Обратите внимание на то, что для смены текста используется метод setText. Только это не тот же setText, что мы использовали, когда задавали текст напрямую. Этот на вход принимает ID и мы используем R.java, который хранит ID всех наших ресурсов. Т.е. методы называются одинаково, но на вход принимают разные параметры. Это нормальное явление в Java.

Сохраняем, запускаем и проверяем. Теперь тексты и цвета взяты из файла ресурсов. Вы можете изменить содержимое myres.xml (например текст для верхней кнопки), сохранить, запустить приложение и увидите изменения.

Иногда необходимо в коде получить не ID ресурса, а его значение. Это делается следующим образом:

Выражение вернет текст «Нижний текст», соответствующий String-ресурсу с name = tvBottomText.

Напоследок скажу пару слов об организации файлов для хранения ресурсов. Мы сейчас создали String и Color ресурсы в одном файле myres.xml, но рекомендуется их разделять по разным файлам (например strings.xml, colors.xml . ), и в дальнейшем я буду следовать этой рекомендации. Для этого есть причины, позже мы в этом убедимся.

Имена ресурсов сквозные для всех файлов в папке res/values. Т.е. вы не можете в разных файлах создать ресурс с одним именем и типом.

Имена файлов ресурсов могут быть произвольными и файлов можно создавать сколько угодно. В R.java попадут все ресурсы из этих файлов.

На следующем уроке:

- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

- новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Перевод документации [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, например так:

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

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

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

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

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

Вы также можете запросить отдельные ресурсы с использованием методов в классе 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() . Вот некоторые примеры получения доступа к ресурсам из кода:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В этом примере 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() .

Понимание, что используемый в программе текст это отдельный ресурс, такой же как изображения и звук, приходит на сразу. Но стоит несколько раз поменять имя программы в паре десятков файлов или заняться исправлением однотипной синтаксической ошибки в пяти, шести разных местах и необходимость хранить строки отдельно от кода становиться очевидной.
В Android работа со строковыми ресурсами сделана очень удобна и не вызывает поначалу никаких сложностей. В официальной документации она описана в статье String Resources. В файле project\res\values\strings.xml задаем строку и ее имя после чего в Activity загружаем строку по этому имени.
strings.xml
ProjectActivity.java
Эту же строку можно использовать в xml файле разметки формы (layout resource). Как это реализовано можно посмотреть, создав новый проект и открыв файл main.xml.

Описание ресурсов

Загрузка строк

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

Метод getString удобно использовать, когда в строку из ресурсов нужно внести дополнительные данные перед дальнейшим использованием. В этом случае в ресурсы помещается форматированная строка и дополнительные параметры для нее указываются прямо в getString, без дополнительного обращения к методу String.format. Примеры разделенные чертой приводят к одним и тем же результатам:

Для формата строки используется следующая конструкция: %X$F.
X$ — номер подставляемого параметра. В основном тексте они обычно идут по порядку 1$, 2$, но в локализованных ресурсах могут меняться местами. Также позволяется использовать один парметр в строке несколько раз.
F — обычный идентификатор формата, такой 's', 'd'. Их полный список, включая форматрирование даты, описан в документации класса Formatter
Если в строке используется только один параметр, то X$ можно опустить. Если считать параметры неудобно, а проблем с локализацией не предвидится, то можно вернуться к стандартной схеме формата строки — для этого в описание элемента нужно добавить атрибут formatted со значением false. Следующие две строки форматируют текст одинаковым образом:

Загрузить строку по ее имени можно также как и любой другой ресурс. Для этого сначала нужно с помощью метода getIdentifier по имени строки найти ее id, а с этим номером уже работать обычным сопособом. Следующий пример загружает строку с именем «score_correct».

Android позволяет хранить в ресурсах массивы строк. Для этого используется тег string-array, который содержит внутри элементы item с конкретными строками. Вот сокращенный пример из документации Android, который иллюстрирует задание массива.
strings.xml
Кроме очевидного применения — удобная загрузка данных, string-array часто используют для иницализации UI элементов с выпадающим списком значений: Spiner и ListPreference. В этом случае обычно требуется использовать одну из строк массива, как значение по умолчанию. Сослаться в ресурсах на конкретный элемент массива мы не можем, но из ситуации можно выйти задействовав псевдонимы для ресурсов.
Элементы массива инициализируются, как обычные строки, а элементы item содержат только ссылку на них. Такая инициализация на самом деле черезвычайно удобна и я использую ее даже в тех случаях, когда обращение к конкретной строке не планируется — это гарантирует, что при локазации все массивы будут одинакового размера, даже если часть строк в них не будет переведена. Само описание массива при этом удобно вынести в отдельный ресурсный файл.
Переписанный с использованием псевдонимов пример выглядит так:

strings.xml
Полезное замечание: до версии Android 2.3 в реализации загрузки string-array была ошибка, которая позволяла загружать максимум только 512 элементов.

Системные строки

Локализация строк

Базовый механизм локализации ресурсов в Android позволяет легко решить практически все задачи с локализацией строк. Полное описание в документации Android можно прочесть здесь. В ресурсах вам необходимо создать новую папку с именем values-xx и поместить туда файлы со строковыми ресурсами из базовой папки values. xx — это двухсимвольный идентификатор языка (список поддерживаемых значений приведен в конце текста). После этого необходимые строки нужно перевести, остальные удалить.
Для более тонкой локализации можно задействовать механизм задания региона. К примеру, у вас в программе есть соглашение пользователя, переведнное на французкий язык, но в нем есть отличия между версией для Франции и версией для Канады. Чтобы реализовать эти отличия надо к папке values-fr добавить название региона в формате rYY, где YY — это двухсимвольное название региона. В данном примере получатся папки values-fr-rFR и values-fr-rCA. В них следует поместить ресурсный файл с необходимой версией соглашения пользователя, а все остальные строки на французском языке оставить в папке values-fr.
Регионы и язык можно указывать без всякой связи друг с другом. Так в папке values-ru-rJP будут храниться русские тексты для жителей Японии.

values/strings.xml
values-no/strings.xml
values-nb/strings.xml
Вы можете создавать ресурсы с какими угодно кодами для языка и для региона. Если операционная система не найдет нужного региона, то она возмет значения для текущего языка. Если не сможет найти язык, то возмет значения по умолчанию из папки values.

Можно загрузить находящиеся в ресурсах строку для языка и региона отличных от установленных на устройстве. Для этого надо создать новый ресурс и задать ему необходимую локаль. Следующий пример загружает строку для французкого языка.

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

Приложение

Поддерживаемые языки до Android 2.3

Английский (en), Голландский (nl), Испанский (es), Итальянский (it), Китайский (zh), Корейский (ko), Немецкий (de), Немецкий (de), Польский (pl), Русский (ru), Французский (fr), Чешский (cs), Японский (ja)

Поддерживаемые языки начиная с Android 2.3

Арабский (ar), Болгарский (bg), Венгерский (hu), Вьетнамский (vi), Греческий (el), Датский (da), Иврит (iw), Индонезийский (in), Каталонский (ca), Латышский (lv), Литовский (lt), Норвежский-Букмол (nb), Португальский (pt), Румынский (ro), Сербский (sr), Словацкий (sk), Словенский (sl), Тагальский (tl), Тайский (th), Турецкий (tr), Украинский (uk), Финский (fi), Хинди (hi), Хорватский (hr), Шведский (sv)

Поддерживаемые регионы до Android 2.3

Австралия (AU), Австрия (AT), Бельгия (BE), Британия (GB), Германия (DE), Испания (ES), Италия (IT), Канада (CA), КНР (CN), Корея (KR), Лихтенштейн (LI), Нидерланды (NL), Новая Зеландия (NZ), Польша (PL), Россия (RU), Сингапур (SG), США (US), Тайвань (TW), Франция (FR), Чешская республика (CZ), Швейцария (CH), Япония (JP)

Поддерживаемые регионы начиная с Android 2.3

Болгария (BG), Бразилия (BR), Венгрия (HU), Вьетнам (VN), Греция (GR), Дания (DK), Египет (EG), Зимбабве (ZA), Израиль (IL), Индия (IN), Индонезия (ID), Ирландия (IE), Латвия (LV), Литва (LT), Норвегия (NO), Португалия (PT), Румыния (RO), Сербия (RS), Словакия (SK), Словения (SI), Таиланд (TH), Турция (TR), Украина (UA), Филиппины (PH), Финляндия (FI)Болгария (BG), Бразилия (BR), Венгрия (HU), Вьетнам (VN), Греция (GR), Дания (DK), Египет (EG), Зимбабве (ZA), Израиль (IL), Индия (IN), Индонезия (ID), Ирландия (IE), Латвия (LV), Литва (LT), Норвегия (NO), Португалия (PT), Румыния (RO), Сербия (RS), Словакия (SK), Словения (SI), Таиланд (TH), Турция (TR), Украина (UA), Филиппины (PH), Финляндия (FI), Хорватия (HR), Швеция (SE)

Update: Добавлен раздел о массивах строк, локализации строк, системных строках. Убран пример с использованием ресурсов для передачи данных между различными Activity.

Читайте также: