Ресурсы — это дополнительные файлы и статический контент, который использует ваш код, например растровые изображения, определения макета, строки пользовательского интерфейса, инструкции анимации и т. д.
Всегда экспортируйте ресурсы приложения, такие как изображения и строки, из вашего кода, чтобы вы могли поддерживать их независимо. Кроме того, предоставьте альтернативные ресурсы для конкретных конфигураций устройств, сгруппировав их в специально названных каталогах ресурсов. Во время выполнения Android использует соответствующий ресурс в зависимости от текущей конфигурации. Например, вы можете захотеть предоставить другой макет пользовательского интерфейса в зависимости от размера экрана или разные строки в зависимости от настроек языка.
После того как вы экспортируете ресурсы своего приложения, вы сможете получить к ним доступ, используя идентификаторы ресурсов, сгенерированные в классе R
вашего проекта. В этом документе показано, как группировать ресурсы в вашем проекте Android. Здесь также показано, как предоставить альтернативные ресурсы для конкретных конфигураций устройств, а затем получить к ним доступ из кода приложения или других XML-файлов.
Типы ресурсов группы
Поместите каждый тип ресурса в определенный подкаталог каталога res/
вашего проекта. Например, вот иерархия файлов для простого проекта:
MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml
Каталог res/
содержит все ресурсы в своих подкаталогах: ресурс изображения, два ресурса макета, каталог mipmap/
для значков запуска и файл строковых ресурсов. Имена каталогов ресурсов важны и описаны в таблице 1.
Примечание. Дополнительные сведения об использовании папок MIP-карт см. в разделе Размещение значков приложений в каталогах MIP-карт .
Таблица 1. Поддерживаемые каталоги ресурсов внутри каталога res/
проекта.
Каталог | Тип ресурса |
---|---|
animator/ | XML-файлы, определяющие анимацию свойств . |
anim/ | XML-файлы, определяющие анимацию Tween . Анимацию свойств также можно сохранить в этом каталоге, но для анимации свойств предпочтительнее использовать каталог animator/ , чтобы различать эти два типа. |
color/ | XML-файлы, определяющие список состояний цветов. Дополнительные сведения см. в разделе Ресурс списка состояний цвета . |
drawable/ | Файлы растровых изображений (PNG,
Дополнительные сведения см. в разделе Ресурсы, доступные для рисования . |
mipmap/ | Рисуемые файлы для разной плотности значков запуска. Дополнительную информацию об управлении значками запуска с помощью папок mipmap/ см. в разделе Размещение значков приложений в каталогах mipmap . |
layout/ | XML-файлы, определяющие макет пользовательского интерфейса. Дополнительные сведения см. в разделе Ресурс макета . |
menu/ | XML-файлы, определяющие меню приложения, например меню параметров, контекстное меню или подменю. Дополнительную информацию см. в разделе Ресурс меню . |
raw/ | Произвольные файлы для сохранения в необработанном виде. Чтобы открыть эти ресурсы с помощью необработанного Однако, если вам нужен доступ к исходным именам файлов и иерархии файлов, рассмотрите возможность сохранения ресурсов в каталоге |
values/ | XML-файлы, содержащие простые значения, такие как строки, целые числа и цвета. В то время как файлы ресурсов XML в других подкаталогах Поскольку каждый ресурс определен с помощью собственного XML-элемента, вы можете назвать файл как угодно и поместить разные типы ресурсов в один файл. Однако для ясности вы можете поместить уникальные типы ресурсов в разные файлы. Например, вот некоторые соглашения об именах файлов для ресурсов, которые вы можете создать в этом каталоге:
Дополнительные сведения см. в разделах Строковые ресурсы , Ресурс стиля и Дополнительные типы ресурсов . |
xml/ | Произвольные XML-файлы, которые можно прочитать во время выполнения, вызвав Resources.getXML() . Здесь необходимо сохранить различные файлы конфигурации XML, например конфигурацию поиска . |
font/ | Файлы шрифтов с такими расширениями, как TTF, OTF или TTC, или файлы XML, включающие элемент <font-family> . Дополнительные сведения о шрифтах как ресурсах см. в разделе Добавление шрифта как ресурса XML . |
Внимание: никогда не сохраняйте файлы ресурсов непосредственно в каталоге res/
. Это вызывает ошибку компилятора.
Дополнительную информацию об отдельных типах ресурсов см. в обзоре типов ресурсов .
Ресурсы, которые вы сохраняете в подкаталогах, определенных в таблице 1, являются вашими ресурсами по умолчанию. То есть эти ресурсы определяют дизайн и контент вашего приложения по умолчанию. Однако разные типы устройств на базе Android могут требовать разных типов ресурсов.
Например, вы можете предоставить различные ресурсы макета для устройств с экранами большего размера, чем обычно, чтобы использовать дополнительное пространство экрана. Вы также можете предоставить различные строковые ресурсы, которые переводят текст в пользовательском интерфейсе в зависимости от языковых настроек устройства. Чтобы предоставить эти разные ресурсы для разных конфигураций устройств, вам необходимо предоставить альтернативные ресурсы в дополнение к ресурсам по умолчанию.
Предоставьте альтернативные ресурсы
Большинство приложений предоставляют альтернативные ресурсы для поддержки определенных конфигураций устройств. Например, включите альтернативные ресурсы рисования для разных плотностей экрана и альтернативные строковые ресурсы для разных языков. Во время выполнения Android определяет текущую конфигурацию устройства и загружает соответствующие ресурсы для вашего приложения.
![](https://developer.android.com/static/images/resources/resource_devices_diagram2.png?authuser=5&hl=ru)
Рис. 1. Два устройства, использующие разные ресурсы макета в зависимости от размера экрана.
Чтобы указать альтернативы конкретной конфигурации для набора ресурсов, выполните следующие действия:
- Создайте новый каталог в
res/
с именем в форме<resources_name> - <qualifier>
.-
<resources_name>
— имя каталога соответствующих ресурсов по умолчанию (определено в таблице 1). -
<qualifier>
— это имя, указывающее индивидуальную конфигурацию, для которой должны использоваться эти ресурсы (определено в таблице 2).
Вы можете добавить более одного
<qualifier>
. Каждую отделяйте черточкой.Внимание: При добавлении нескольких квалификаторов их необходимо размещать в том же порядке, в котором они перечислены в таблице 2. Если квалификаторы расположены неправильно, ресурсы игнорируются.
-
- Сохраните соответствующие альтернативные ресурсы в этом новом каталоге. Файлы ресурсов должны называться точно так же, как файлы ресурсов по умолчанию.
Например, вот некоторые ресурсы по умолчанию и альтернативные ресурсы:
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
Квалификатор hdpi
указывает, что ресурсы в этом каталоге предназначены для устройств с экраном высокой плотности. Изображения в этих доступных для рисования каталогах имеют размер для определенной плотности экрана, но имена файлов абсолютно одинаковы. Таким образом, идентификатор ресурса, который вы используете для ссылки на изображение icon.png
или background.png
, всегда один и тот же. Android выбирает версию каждого ресурса, которая лучше всего соответствует текущему устройству, сравнивая информацию о конфигурации устройства с квалификаторами в имени каталога ресурсов.
Внимание: При определении альтернативного ресурса убедитесь, что вы также определили ресурс в конфигурации по умолчанию. В противном случае ваше приложение может столкнуться с исключениями во время выполнения, когда устройство меняет конфигурацию. Например, если вы добавите строку только в values-en
, а не values
, ваше приложение может столкнуться с исключением Resource Not Found
, когда пользователь меняет системный язык по умолчанию.
В таблице 2 перечислены допустимые квалификаторы конфигурации в порядке приоритета. К одному имени каталога можно добавить несколько квалификаторов, разделяя каждый квалификатор дефисом. Если вы используете несколько квалификаторов для каталога ресурсов, вы должны добавить их к имени каталога в том порядке, в котором они перечислены в таблице.
Таблица 2. Имена квалификаторов конфигурации.
Конфигурация | Значения квалификаторов | Описание |
---|---|---|
МСС и МНК | Примеры:mcc310
mcc208-mnc00 | Мобильный код страны (MCC), за которым при необходимости следует код мобильной сети (MNC) с SIM-карты в устройстве. Например, Если устройство использует радиосвязь (то есть это телефон GSM), значения MCC и MNC берутся с SIM-карты. Вы также можете использовать только MCC, например, чтобы включить в свое приложение юридические ресурсы для конкретной страны. Если вам нужно указать только язык, используйте вместо этого квалификатор языка, алфавита (необязательно) и региона (необязательно) . Если вы используете квалификаторы MCC и MNC, делайте это осторожно и проверяйте, работает ли он должным образом. Также см. поля конфигурации |
Язык, алфавит (необязательно) и регион (необязательно). | Примеры:en fr en-rUS fr-rFR fr-rCA b+en b+en+US b+es+419 b+zh+Hant b+sr+Latn+RS | Язык определяется двухбуквенным кодом языка ISO 639-1 , за которым может следовать двухбуквенный код региона ISO 3166-1-alpha-2 (перед которым стоит строчная буква Коды не чувствительны к регистру. Префикс В Android 7.0 (уровень API 24) появилась поддержка языковых тегов BCP 47 , которые можно использовать для квалификации ресурсов, зависящих от языка и региона. Языковой тег состоит из последовательности одного или нескольких вложенных тегов, каждый из которых уточняет или сужает диапазон языка, идентифицируемый общим тегом. Дополнительную информацию о языковых тегах см. в разделе Теги для идентификации языков . Чтобы использовать языковой тег BCP 47, объедините Языковой тег может измениться в течение срока службы вашего приложения, если пользователи изменят свой язык в настройках системы. Сведения о том, как это может повлиять на ваше приложение во время выполнения, см. в разделе Обработка изменений конфигурации . Полное руководство по локализации вашего приложения для других языков см. в разделе Локализация вашего приложения . Также см. метод |
Направление макета | ldrtl ldltr | Направление макета вашего приложения. Это может применяться к любому ресурсу, например макетам, объектам рисования или значениям. Например, если вы хотите предоставить специальную раскладку для арабского языка и общую раскладку для любого другого языка с письмом справа налево, например персидского или иврита, вы используете следующие каталоги: Примечание. Чтобы включить функции макета справа налево для вашего приложения, необходимо установить Добавлено на уровне API 17. |
Наименьшая ширина | sw<N>dp Примеры: sw320dp sw600dp sw720dp и т. д. | Самый короткий размер области экрана, доступный приложению. В частности, Например, если ваш макет требует, чтобы наименьший размер области экрана всегда составлял не менее 600 dp, вы можете использовать этот квалификатор для создания ресурсов макета в каталоге Использование наименьшей ширины для определения общего размера экрана полезно, поскольку ширина часто является решающим фактором при разработке макета. Пользовательский интерфейс часто прокручивается по вертикали, но имеет довольно жесткие ограничения на минимальное пространство, необходимое для него по горизонтали. Доступная ширина также является ключевым фактором при определении того, использовать ли макет с одной панелью для мобильных телефонов или макет с несколькими панелями для планшетов. Таким образом, вас, вероятно, больше всего волнует, какая наименьшая возможная ширина будет на каждом устройстве. Наименьшая ширина устройства учитывает оформление экрана и системный интерфейс. Например, если на экране устройства есть постоянные элементы пользовательского интерфейса, которые занимают пространство вдоль оси наименьшей ширины, система объявляет, что наименьшая ширина меньше фактического размера экрана, поскольку это пиксели экрана, недоступные для вашего пользовательского интерфейса. . Некоторые значения, которые вы можете использовать здесь для распространенных размеров экрана:
Когда ваше приложение предоставляет несколько каталогов ресурсов с разными значениями квалификатора Добавлено на уровне API 13. Также см. атрибут Дополнительную информацию о проектировании для различных экранов с использованием этого квалификатора см. в разделе Адаптивный/адаптивный дизайн с представлениями . |
Доступная ширина и высота | w<N>dp h<N>dp Примеры: w720dp w1024dp h720dp h1024dp и т. д. | Указывает минимальную доступную ширину или высоту экрана (в единицах Доступная ширина и высота часто полезны для определения того, следует ли использовать многопанельный макет, поскольку даже на планшетном устройстве часто не требуется тот же многопанельный макет для книжной ориентации, что и для альбомной. Таким образом, вы можете использовать их для указания минимальной ширины и/или высоты, необходимой для макета, вместо того, чтобы использовать одновременно размер экрана и квалификаторы ориентации. Когда ваше приложение предоставляет несколько каталогов ресурсов с разными значениями для этих конфигураций, система использует тот, который ближе всего (не превышает) к текущей ширине экрана устройства. Ближайший к определяется путем добавления разницы между фактической шириной экрана и указанной шириной к разнице между фактической высотой экрана и указанной высотой, при этом неуказанные значения высоты и ширины имеют значение 0. Значения исключают область, занимаемую вставками Window , поэтому, если устройство имеет постоянные элементы пользовательского интерфейса по краям дисплея, значения ширины и высоты будут меньше реальных размеров экрана, даже если приложение отображается от края до края с использованием Некоторые незафиксированные вертикальные украшения экрана (например, строка состояния телефона, которая может быть скрыта в полноэкранном режиме) здесь не учитываются, а также украшения окон, такие как строка заголовка или панель действий, поэтому приложения должны быть готовы к работе с ними. несколько меньшее пространство, чем указано. Примечание. Система выбирает ресурс, соответствующий как по ширине, так и по высоте. Поэтому ресурс, в котором указаны оба параметра, предпочтительнее, чем ресурс, в котором указано только одно или другое. Например, если фактический экран имеет ширину 720 dp и высоту 1 280 dp, а один ресурс квалифицируется как w720dp, а другой — как w700dp-h1200dp, выбирается последний, даже если первый точно соответствует тому, что он указывает. Добавлено на уровне API 13. Также см. поля конфигурации Дополнительную информацию о проектировании для разных экранов с использованием этого квалификатора см. в разделе Адаптивный/адаптивный дизайн с представлениями . |
Размер экрана | small normal large xlarge |
Примечание. Использование квалификатора размера не означает, что ресурсы предназначены только для экранов такого размера. Если вы не предоставляете альтернативные ресурсы с квалификаторами, которые лучше соответствуют текущей конфигурации устройства, система может использовать те ресурсы, которые лучше всего подходят . Внимание: если все ваши ресурсы используют квалификатор размера, который больше текущего экрана, система не использует их, и ваше приложение аварийно завершает работу во время выполнения. Это происходит, например, если все ресурсы макета помечены квалификатором Добавлено в API уровня 4. Также см. поле конфигурации Дополнительную информацию см. в разделе Обзор совместимости экранов . |
Формат экрана | long notlong |
Добавлено в API уровня 4. Это основано исключительно на соотношении сторон экрана ( Также см. поле конфигурации |
Круглый экран | round notround |
Добавлено на уровне API 23. Также см. метод конфигурации |
Широкая цветовая гамма | widecg nowidecg |
Добавлено на уровне API 26. Также см. метод конфигурации |
Широкий динамический диапазон (HDR) | highdr lowdr |
Добавлено на уровне API 26. Также см. метод конфигурации |
Ориентация экрана | port land |
Это может измениться в течение срока службы вашего приложения, если пользователь поворачивает экран. Сведения о том, как это повлияет на ваше приложение во время выполнения, см. в разделе Обработка изменений конфигурации . Также см. поле конфигурации |
Режим пользовательского интерфейса | car desk television appliance watch vrheadset |
Добавлен уровень API 8; телевидение добавлено в API 13; часы добавлены в API 20. Информацию о том, как ваше приложение может реагировать, когда устройство вставляется в док-станцию или вынимается из нее, читайте в статье «Определение и мониторинг состояния стыковки» и введите . Это может измениться в течение срока службы вашего приложения, если пользователь поместит устройство в док-станцию. Вы можете включить или отключить некоторые из этих режимов с помощью |
Ночной режим | night notnight |
Добавлено на уровне API 8. Это может измениться в течение срока службы вашего приложения, если ночной режим оставить в автоматическом режиме (по умолчанию), и в этом случае режим меняется в зависимости от времени суток. Вы можете включить или отключить этот режим с помощью |
Плотность пикселей экрана (точек на дюйм) | ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi anydpi nnn dpi |
Между шестью основными плотностями существует соотношение масштабирования 3:4:6:8:12:16 (без учета плотности tvdpi). Таким образом, растровое изображение 9x9 в ldpi имеет размер 12x12 в mdpi, 18x18 в hdpi, 24x24 в xhdpi и так далее. Примечание. Использование квалификатора плотности не означает, что ресурсы предназначены только для экранов этой плотности. Если вы не предоставляете альтернативные ресурсы с квалификаторами, которые лучше соответствуют текущей конфигурации устройства, система использует те ресурсы, которые лучше всего подходят . Дополнительные сведения о том, как обрабатывать различные плотности экрана и как Android может масштабировать растровые изображения в соответствии с текущей плотностью, см. в разделе Обзор совместимости экранов . |
Тип сенсорного экрана | notouch finger |
Также см. поле конфигурации |
Наличие клавиатуры | keysexposed keyshidden keyssoft |
Если вы предоставляете ресурсы Это может измениться в течение срока службы вашего приложения, если пользователь откроет аппаратную клавиатуру. Сведения о том, как это повлияет на ваше приложение во время выполнения, см. в разделе Обработка изменений конфигурации . Также см. поля конфигурации |
Основной метод ввода текста | nokeys qwerty 12key |
Также см. поле конфигурации |
Наличие навигационной клавиши | navexposed navhidden |
Это может измениться в течение срока службы вашего приложения, если пользователь раскроет клавиши навигации. Сведения о том, как это повлияет на ваше приложение во время выполнения, см. в разделе Обработка изменений конфигурации . Также см. поле конфигурации |
Основной метод бессенсорной навигации | nonav dpad trackball wheel |
Также см. поле конфигурации |
Версия платформы (уровень API) | Примеры:v3 v4 v7 и т. д. | Уровень API, поддерживаемый устройством. Например, |
Примечание. Не все версии Android поддерживают все квалификаторы. Использование нового квалификатора неявно добавляет квалификатор версии платформы, чтобы старые устройства могли его игнорировать. Например, использование квалификатора w600dp
автоматически включает квалификатор v13
, поскольку квалификатор доступной ширины был новым на уровне API 13. Чтобы избежать каких-либо проблем, всегда включайте набор ресурсов по умолчанию (набор ресурсов без квалификаторов ). Дополнительную информацию см. в разделе Обеспечение наилучшей совместимости устройств с ресурсами .
Правила имени квалификатора
Вот несколько правил использования имен квалификаторов конфигурации:
- Для одного набора ресурсов можно указать несколько квалификаторов, разделенных дефисами. Например,
drawable-en-rUS-land
применяется к американско-английским устройствам в альбомной ориентации. - Квалификаторы должны быть расположены в порядке, указанном в таблице 2 .
- Неправильно:
drawable-hdpi-port/
- Правильно:
drawable-port-hdpi/
- Неправильно:
- Альтернативные каталоги ресурсов не могут быть вложенными. Например, вы не можете использовать
res/drawable/drawable-en/
. - Значения не чувствительны к регистру. Компилятор ресурсов преобразует имена каталогов в нижний регистр перед обработкой, чтобы избежать проблем в файловых системах, нечувствительных к регистру. Использование заглавных букв в именах предназначено только для удобства чтения.
- Поддерживается только одно значение для каждого типа квалификатора. Например, если вы хотите использовать одни и те же файлы для рисования для Испании и Франции, у вас не может быть каталога с именем
drawable-es-fr/
. Вместо этого вам нужны два каталога ресурсов, такие какdrawable-es/
иdrawable-fr/
, которые содержат соответствующие файлы. Однако вам не обязательно дублировать файлы в обоих местах. Вместо этого вы можете создать псевдоним для ресурса, как описано в разделе Создание ресурсов-псевдонимов .
После сохранения альтернативных ресурсов в каталогах, названных с помощью этих квалификаторов, Android автоматически применяет ресурсы в вашем приложении на основе текущей конфигурации устройства. Каждый раз, когда запрашивается ресурс, Android проверяет альтернативные каталоги ресурсов, содержащие запрошенный файл ресурса, а затем находит наиболее подходящий ресурс .
Если нет альтернативных ресурсов, соответствующих определенной конфигурации устройства, Android использует соответствующие ресурсы по умолчанию — набор ресурсов для определенного типа ресурсов, который не включает квалификатор конфигурации.
Создание ресурсов псевдонимов
Если у вас есть ресурс, который вы хотели бы использовать для нескольких конфигураций устройств, но не хотите предоставлять его в качестве ресурса по умолчанию, вам не нужно помещать один и тот же ресурс в несколько альтернативных каталогов ресурсов. Вместо этого вы можете создать альтернативный ресурс, который будет выступать в качестве псевдонима для ресурса, сохраненного в каталоге ресурсов по умолчанию.
Примечание. Не все ресурсы предлагают механизм, с помощью которого можно создать псевдоним для другого ресурса. В частности, анимация, меню, raw и другие неуказанные ресурсы в каталоге xml/
не поддерживают эту функцию.
Например, представьте, что у вас есть значок приложения icon.png
и вам нужна уникальная его версия для разных языков. Однако две локали, англо-канадская и франко-канадская, должны использовать одну и ту же версию. Вам не нужно копировать одно и то же изображение в каталог ресурсов как для англо-канадского, так и для франко-канадского языка. Вместо этого вы можете сохранить изображение, которое используется для обоих, используя любое имя, кроме icon.png
, например icon_ca.png
, и поместить его в каталог res/drawable/
по умолчанию. Затем создайте файл icon.xml
в res/drawable-en-rCA/
и res/drawable-fr-rCA/
, который ссылается на ресурс icon_ca.png
, используя элемент <bitmap>
. Это позволяет хранить только одну версию файла PNG и два небольших XML-файла, указывающих на него. Подробности смотрите в примерах в следующих разделах.
Рисуемый
Чтобы создать псевдоним для существующего объекта рисования, используйте элемент <drawable>
:
<?xml version="1.0" encoding="utf-8"?> <resources> <drawable name="icon">@drawable/icon_ca</drawable> </resources>
Если вы сохраните этот файл как icon.xml
в альтернативном каталоге ресурсов, например res/values-en-rCA/
, он скомпилируется в ресурс, на который вы можете ссылаться как R.drawable.icon
, но на самом деле это псевдоним для Ресурс R.drawable.icon_ca
, который сохраняется в res/drawable/
.
Макет
Чтобы создать псевдоним существующего макета, используйте элемент <include>
, заключенный в <merge>
:
<?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge>
Если вы сохраните этот файл как main.xml
, он скомпилируется в ресурс, на который вы можете ссылаться как R.layout.main
, но на самом деле это псевдоним ресурса R.layout.main_ltr
.
Строки и другие простые значения
Чтобы создать псевдоним для существующей строки, используйте идентификатор ресурса нужной строки в качестве значения для новой строки:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
Ресурс R.string.hi
теперь является псевдонимом R.string.hello
.
Другие простые значения работают таким же образом, например цвета:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="red">#f00</color> <color name="highlight">@color/red</color> </resources>
Доступ к ресурсам вашего приложения
После того как вы предоставите ресурс в своем приложении, вы сможете применить его, указав его идентификатор ресурса. Все идентификаторы ресурсов определяются в классе R
вашего проекта, который автоматически генерирует инструмент aapt
.
Когда ваше приложение скомпилировано, aapt
генерирует класс R
, который содержит идентификаторы всех ресурсов в вашем каталоге res/
. Для каждого типа ресурса существует подкласс R
, например R.drawable
для всех доступных для рисования ресурсов. И для каждого ресурса этого типа существует статическое целое число, например R.drawable.icon
. Это целое число представляет собой идентификатор ресурса, который вы можете использовать для получения ресурса.
Хотя в классе R
указываются идентификаторы ресурсов, вам не нужно заглядывать туда, чтобы найти идентификатор ресурса. Идентификатор ресурса всегда состоит из следующего:
- Тип ресурса : каждый ресурс сгруппирован по «типу», например
string
,drawable
иlayout
. Дополнительные сведения о различных типах см. в разделе Обзор типов ресурсов . - Имя ресурса , которое является либо именем файла, за исключением расширения, либо значения в атрибуте XML
android:name
, если ресурс является простым значением, таким как строка.
Есть два способа получить доступ к ресурсу:
- В коде: используя статическое целое число из подкласса вашего класса
R
, например:R.string.hello
string
- это тип ресурса, аhello
- это имя ресурса. Есть много API API Android, которые могут получить доступ к вашим ресурсам при предоставлении идентификатора ресурса в этом формате. Для получения дополнительной информации см. Ресурсы доступа в разделе кода . - В XML: используя специальный синтаксис XML, который соответствует идентификатору ресурса, определенным в вашем классе
R
, например:@string/hello
string
- это тип ресурса, аhello
- это имя ресурса. Вы можете использовать этот синтаксис в ресурсе XML в любом месте, где ожидается значение, которое вы предоставляете в ресурсе. Для получения дополнительной информации см. Ресурсы доступа из раздела XML .
Доступ к ресурсам в коде
Вы можете использовать ресурс в коде, передавая идентификатор ресурса в качестве параметра метода. Например, вы можете установить ImageView
для использования ресурса res/drawable/myimage.png
с использованием setImageResource()
:
Котлин
val imageView = findViewById(R.id.myimageview) as ImageView imageView.setImageResource(R.drawable.myimage)
Ява
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
для типа ресурса. -
<resource_name>
является либо именем файла ресурса без расширения, либо значения атрибутаandroid:name
в элементе XML, для простых значений.
Для получения дополнительной информации о каждом типе ресурса и о том, как их ссылаться, см. Обзор типов ресурсов .
Варианты использования
Существует много методов, которые принимают параметр идентификатора ресурса, и вы можете получить ресурсы, используя методы в Resources
. Вы можете получить экземпляр Resources
с помощью Context.getResources()
.
Вот несколько примеров доступа к ресурсам в коде:
Котлин
// Load a background for the current screen from a drawable resource. window.setBackgroundDrawableResource(R.drawable.my_background_image) // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID. window.setTitle(resources.getText(R.string.main_title)) // Load a custom layout for the current screen. setContentView(R.layout.main_screen) // Set a slide in animation by getting an Animation from the Resources object. flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)) // Set the text on a TextView object using a resource ID. val msgTextView = findViewById(R.id.msg) as TextView msgTextView.setText(R.string.hello_message)
Ява
// Load a background for the current screen from a drawable resource. getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ; // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID. getWindow().setTitle(getResources().getText(R.string.main_title)); // Load a custom layout for the current screen. setContentView(R.layout.main_screen); // Set a slide in animation by getting an Animation from the Resources object. flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)); // Set the text on a TextView object using a resource ID. TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello_message);
Осторожно: не изменяйте файл R.java
вручную. Он генерируется инструментом aapt
при составлении вашего проекта. Любые изменения переопределены в следующий раз, когда вы компилируете.
Доступ к ресурсам от XML
Вы можете определить значения для некоторых атрибутов и элементов XML, используя ссылку на существующий ресурс. Вы часто делаете это при создании файлов макета, для подачи строк и изображений для ваших виджетов.
Например, если вы добавляете Button
в свой макет, используйте ресурс строки для текста кнопки:
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/submit" />
Синтаксис
Вот синтаксис для ссылки на ресурс в ресурсе XML:
@[<package_name>:]<resource_type>/<resource_name>
<package_name>
- это имя пакета, в котором находится ресурс (не требуется при ссылке на ресурсы из того же пакета).-
<resource_type>
- подклассR
для типа ресурса. -
<resource_name>
является либо именем файла ресурса без расширения, либо значения атрибутаandroid:name
в элементе XML, для простых значений.
Для получения дополнительной информации о каждом типе ресурса и о том, как их ссылаться, см. Обзор типов ресурсов .
Варианты использования
В некоторых случаях вы должны использовать ресурс для значения в XML, например, для применения изображения, который можно привести к виджету, но вы также можете использовать ресурс в XML в любом месте, которое принимает простое значение. Например, если у вас есть следующий файл ресурса, который включает в себя цветный ресурс и ресурс String :
<?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" />
В этом случае вам не нужно указывать имя пакета в справочнике ресурса, потому что ресурсы из вашего собственного пакета. Чтобы ссылаться на системный ресурс, вам необходимо включить имя пакета, как показано в следующем примере:
<?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" />
ПРИМЕЧАНИЕ. Всегда используйте строковые ресурсы, чтобы ваше приложение было локализовано для других языков. Информацию об создании альтернативных ресурсов (таких как локализованные строки) см. В качестве альтернативных ресурсов . Полное руководство по локализации вашего приложения для других языков см. В локализации вашего приложения .
Вы даже можете использовать ресурсы в XML для создания псевдонимов. Например, вы можете создать ресурс для притяжения, который является псевдонимом для другого ресурса для привлечения:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/other_drawable" />
Это звучит избыточно, но может быть очень полезно при использовании альтернативного ресурса. Для получения дополнительной информации см. Раздел о создании псевдоним ресурсов .
Атрибуты стиля ссылки
Ресурс атрибута стиля позволяет ссылаться на значение атрибута в применяемой в настоящее время теме. Ссылаясь на атрибут стиля, позволяет настроить внешний вид элементов пользовательского интерфейса, устремляя их в соответствии с стандартными вариациями, предоставленными текущей темой, вместо того, чтобы поставлять жесткое значение. Ссылаясь на атрибут стиля, по сути, говорится: «Используйте стиль, который определяется этим атрибутом в текущей теме».
Чтобы ссылаться на атрибут стиля, синтаксис имени почти идентичен нормальному формату ресурса, но вместо «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
Style в качестве значения для android:textColor
в этом виджете. Поскольку инструмент системного ресурса знает, что в этом контексте ожидается ресурс атрибута, вам не нужно явно указывать тип, который ?android:attr/textColorSecondary
. Вы можете исключить тип attr
.
Доступ к исходным файлам
Несмотря на необычную, вам может понадобиться доступ к вашим исходным файлам и каталогам. Если вы это сделаете, то сохранение ваших файлов в res/
не будет работать для вас, потому что единственный способ прочитать ресурс из res/
- это идентификатор ресурса. Вместо этого вы можете сохранить свои ресурсы в assets/
каталоге.
Файлы, сохраненные в assets/
каталоге, не дают идентификатор ресурса, поэтому вы не можете ссылаться на них через класс R
или из ресурсов XML. Вместо этого вы можете запросить файлы в assets/
каталоге, таких как обычная файловая система, и читать необработанные данные с помощью AssetManager
.
Однако, если все, что вам нужно, это возможность читать необработанные данные (например, видео или аудиофайл), то сохраните файл в каталоге res/raw/
прочитайте поток байтов с использованием openRawResource()
.
Доступ к ресурсам платформы
Android содержит ряд стандартных ресурсов, таких как стили, темы и макеты. Чтобы получить доступ к этим ресурсам, квалифицируйте ссылку на ресурсы с помощью имени пакета android
. Например, Android предоставляет ресурс макета, который вы можете использовать для элементов списка в ListAdapter
:
Котлин
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)
Ява
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
В этом примере simple_list_item_1
- это ресурс макета, определяемый платформой для элементов в ListView
. Вы можете использовать это вместо того, чтобы создавать свой собственный макет для элементов списка.
Обеспечить лучшую совместимость устройств с ресурсами
Чтобы ваше приложение для поддержки нескольких конфигураций устройства очень важно, чтобы вы всегда предоставляли ресурсы по умолчанию для каждого типа ресурса, который использует ваше приложение.
Например, если ваше приложение поддерживает несколько языков, всегда включайте values/
каталог (в которых сохранены ваши строки) без языка и квалификатора региона . Если вместо этого вы помещаете все свои строковые файлы в каталоги, которые имеют квалификатор языка и региона, то ваше приложение сбоя при запуске на устройстве, установленном на языке, который ваши строки не поддерживают.
Пока вы предоставляете values/
ресурсы по умолчанию, то ваше приложение работает должным образом, даже если пользователь не понимает язык, который он представляет. Это лучше, чем разбиться.
Аналогично, если вы предоставляете различные ресурсы макета на основе ориентации экрана, выберите одну ориентацию в качестве по умолчанию. Например, вместо того, чтобы предоставлять ресурсы макета в layout-land/
для ландшафта и layout-port/
для портрета, оставьте его по умолчанию, например layout/
для ландшафта и layout-port/
для портрета.
Предоставление ресурсов по умолчанию важно не только потому, что ваше приложение может работать на конфигурации, которую вы не ожидали, но и потому, что новые версии Android иногда добавляют квалификаторы конфигурации, которые не поддерживают более старые версии. Если вы используете новый квалификатор ресурсов, но поддерживаете совместимость с кодом с более старыми версиями Android, то, когда старая версия Android запускает ваше приложение, она вылетает, если вы не предоставляете ресурсы по умолчанию, потому что он не может использовать ресурсы, названные с новый квалификатор.
Например, если ваша minSdkVersion
установлена на 4, и вы квалифицируете все свои ресурсы для привлечения, используя ночной режим ( night
или notnight
, которые были добавлены на уровне API 8), то устройство API уровня 4 не может получить доступ к вашим ресурсам и ресурсам и падает. В этом случае вы, вероятно, не хотите, чтобы notnight
была вашим ресурсом по умолчанию, поэтому исключите этот квалификатор и поместите ваши ресурсы для притяжения в drawable/
drawable-night/
.
Короче говоря, чтобы обеспечить наилучшую совместимость с устройством, всегда предоставляйте ресурсы по умолчанию для ресурсов, которые необходимо вашему приложению для правильного выполнения. Затем создайте альтернативные ресурсы для конкретных конфигураций устройства, используя квалификаторы конфигурации.
Существует одно исключение из этого правила: если minSdkVersion
вашего приложения составляет 4 или более, вам не нужны ресурсы для притяжения по умолчанию, когда вы предоставляете альтернативные ресурсы для привлечения с квалификатором плотности экрана . Даже без ресурсов по умолчанию Android может найти лучшее совпадение среди альтернативных плотностей экрана и масштабировать растровые карты по мере необходимости. Тем не менее, для лучшего опыта на всех типах устройств предоставьте альтернативные притяжения для всех трех типов плотности.
Как Android находит лучший ресурс
Когда вы запрашиваете ресурс, для которого вы предоставляете альтернативы, Android выбирает, какой альтернативный ресурс использовать во время выполнения, в зависимости от текущей конфигурации устройства. Чтобы продемонстрировать, как Android выбирает альтернативный ресурс, предположим, что в следующих каталогах каждая из них содержит разные версии одних и тех же изображений:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
И предположим, что следующее - конфигурация устройства:
Locale = en-GB
Ориентация экрана = port
Плотность пикселей экрана = hdpi
Сенсорный экран тип = notouch
Метод ввода первичного текста = 12key
Сравнивая конфигурацию устройства с доступными альтернативными ресурсами, Android выбирает Drawables из drawable-en-port
.
Система приходит к своему решению, для каких ресурсов использовать со следующей логикой:
![](https://developer.android.com/static/images/resources/res-selection-flowchart.png?authuser=5&hl=ru)
Рисунок 2. Блок-схема того, как Android находит лучший ресурс.
- Устранение файлов ресурсов, которые противоречат конфигурации устройства.
Справочник
drawable-fr-rCA/
удаляется, потому что он противоречит локалеen-GB
.drawable/ drawable-en/
drawable-fr-rCA/drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/Исключение: Плотность пикселей экрана - это тот квалификатор, который не устранен из -за противоречия. Несмотря на то, что плотность экрана устройства-HDPI,
drawable-port-ldpi/
не устраняется, потому что каждая плотность экрана считается совпадением на этой точке. Для получения информации см. Обзор совместимости экрана . - Найдите квалификатор следующего самого высокого предстоящего в списке ( Таблица 2 ). (Начните с MCC.)
- Есть ли какой -либо из каталогов ресурсов, включающий этот квалификатор?
- Если нет, вернитесь ко второму шагу и посмотрите на следующий квалификатор. В этом примере ответ «нет» до тех пор, пока не будет достигнут квалификатор языка.
- Если да, продолжайте на четвертом шаге.
- Устранение каталогов ресурсов, которые не включают этот квалификатор. В этом примере система следующая исключает все каталоги, которые не включают языковой квалификатор:
drawable/drawable-en/ drawable-en-port/ drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/Исключение: если рассматриваемым квалификатором является плотность пикселей экрана, Android выбирает опцию, которая наиболее близко соответствует плотности экрана устройства. В целом, Android предпочитает масштабировать более широкое оригинальное изображение, чтобы увеличить меньшее исходное изображение. Для получения дополнительной информации см. Обзор совместимости экрана .
- Повторите шаги два, три и четыре, пока не останется только один каталог. В этом примере ориентация экрана является следующим отборочным средством, для которого есть какие -либо совпадения. Таким образом, ресурсы, которые не указывают ориентацию на экран, устраняются:
drawable-en/drawable-en-port/drawable-en-notouch-12key/Оставшийся каталог
drawable-en-port
.
Хотя эта процедура выполняется для каждого запрашиваемого ресурса, система оптимизирует некоторые аспекты этого. Одна из таких оптимизаций заключается в том, что после известной конфигурации устройства она может устранить альтернативные ресурсы, которые никогда не могут соответствовать. Например, если язык конфигурации является английским, то любой каталог ресурсов, в котором имеет языковой квалификатор, установленного на что -то другое, чем английский, никогда не включен в пул ресурсов, проверенный (хотя каталог ресурсов без языкового квалификатора все еще включен).
При выборе ресурсов, основанных на квалификаторах размера экрана, система использует ресурсы, предназначенные для экрана, меньше текущего экрана, если нет ресурсов, которые лучше соответствуют. Например, экран большого размера использует ресурсы экрана нормального размера, если это необходимо.
Однако, если единственные доступные ресурсы больше текущего экрана, система не использует их, а ваше приложение сбоя, если никакие другие ресурсы не соответствуют конфигурации устройства. Это происходит, например, если все ресурсы макета помечены квалификатором xlarge
, но устройство является экраном нормального размера.
Примечание. Приоритет квалификатора (в таблице 2 ) важнее, чем количество квалификаторов, которые точно соответствуют устройству. В предыдущем примере, на четвертом этапе последний выбор в списке включает в себя три отборочных, которые точно соответствуют устройству (ориентация, тип сенсорного экрана и метод ввода), в то время как drawable-en
имеет только один параметр, который соответствует языку). Тем не менее, язык имеет более высокий приоритет, чем эти другие квалификации, поэтому устранен устранена drawable-port-notouch-12key
.