Обзор ресурсов приложения

Ресурсы — это дополнительные файлы и статический контент, который использует ваш код, например растровые изображения, определения макета, строки пользовательского интерфейса, инструкции анимации и т. д.

Всегда экспортируйте ресурсы приложения, такие как изображения и строки, из вашего кода, чтобы вы могли поддерживать их независимо. Кроме того, предоставьте альтернативные ресурсы для конкретных конфигураций устройств, сгруппировав их в специально названных каталогах ресурсов. Во время выполнения 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, .9.png , JPG или GIF) или файлы XML, скомпилированные в следующие подтипы доступных для рисования ресурсов:

  • Растровые файлы
  • Девять патчей (растровые изображения изменяемого размера)
  • Государственные списки
  • Формы
  • Анимация
  • Другие возможности

Дополнительные сведения см. в разделе Ресурсы, доступные для рисования .

mipmap/ Рисуемые файлы для разной плотности значков запуска. Дополнительную информацию об управлении значками запуска с помощью папок mipmap/ см. в разделе Размещение значков приложений в каталогах mipmap .
layout/ XML-файлы, определяющие макет пользовательского интерфейса. Дополнительные сведения см. в разделе Ресурс макета .
menu/ XML-файлы, определяющие меню приложения, например меню параметров, контекстное меню или подменю. Дополнительную информацию см. в разделе Ресурс меню .
raw/

Произвольные файлы для сохранения в необработанном виде. Чтобы открыть эти ресурсы с помощью необработанного InputStream , вызовите Resources.openRawResource() с идентификатором ресурса, который равен R.raw. filename .

Однако, если вам нужен доступ к исходным именам файлов и иерархии файлов, рассмотрите возможность сохранения ресурсов в каталоге assets/ вместо res/raw/ . Файлам в assets/ не присвоен идентификатор ресурса, поэтому их можно прочитать только с помощью AssetManager .

values/

XML-файлы, содержащие простые значения, такие как строки, целые числа и цвета.

В то время как файлы ресурсов XML в других подкаталогах res/ определяют один ресурс на основе имени файла XML, файлы в каталоге values/ описывают несколько ресурсов. Для файла в этом каталоге каждый дочерний элемент <resources> определяет один ресурс. Например, элемент <string> создает ресурс R.string , а элемент <color> создает ресурс R.color .

Поскольку каждый ресурс определен с помощью собственного XML-элемента, вы можете назвать файл как угодно и поместить разные типы ресурсов в один файл. Однако для ясности вы можете поместить уникальные типы ресурсов в разные файлы. Например, вот некоторые соглашения об именах файлов для ресурсов, которые вы можете создать в этом каталоге:

Дополнительные сведения см. в разделах Строковые ресурсы , Ресурс стиля и Дополнительные типы ресурсов .

xml/ Произвольные XML-файлы, которые можно прочитать во время выполнения, вызвав Resources.getXML() . Здесь необходимо сохранить различные файлы конфигурации XML, например конфигурацию поиска .
font/ Файлы шрифтов с такими расширениями, как TTF, OTF или TTC, или файлы XML, включающие элемент <font-family> . Дополнительные сведения о шрифтах как ресурсах см. в разделе Добавление шрифта как ресурса XML .

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

Дополнительную информацию об отдельных типах ресурсов см. в обзоре типов ресурсов .

Ресурсы, которые вы сохраняете в подкаталогах, определенных в таблице 1, являются вашими ресурсами по умолчанию. То есть эти ресурсы определяют дизайн и контент вашего приложения по умолчанию. Однако разные типы устройств на базе Android могут требовать разных типов ресурсов.

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

Предоставьте альтернативные ресурсы

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

Рис. 1. Два устройства, использующие разные ресурсы макета в зависимости от размера экрана.

Чтобы указать альтернативы конкретной конфигурации для набора ресурсов, выполните следующие действия:

  1. Создайте новый каталог в res/ с именем в форме <resources_name> - <qualifier> .
    • <resources_name> — имя каталога соответствующих ресурсов по умолчанию (определено в таблице 1).
    • <qualifier> — это имя, указывающее индивидуальную конфигурацию, для которой должны использоваться эти ресурсы (определено в таблице 2).

    Вы можете добавить более одного <qualifier> . Каждую отделяйте черточкой.

    Внимание: При добавлении нескольких квалификаторов их необходимо размещать в том же порядке, в котором они перечислены в таблице 2. Если квалификаторы расположены неправильно, ресурсы игнорируются.

  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
mcc310-mnc004
mcc208-mnc00

Мобильный код страны (MCC), за которым при необходимости следует код мобильной сети (MNC) с SIM-карты в устройстве. Например, mcc310 — это США для любого оператора связи, mcc310-mnc004 — это США для Verizon, а mcc208-mnc00 — это Франция для Orange.

Если устройство использует радиосвязь (то есть это телефон GSM), значения MCC и MNC берутся с SIM-карты.

Вы также можете использовать только MCC, например, чтобы включить в свое приложение юридические ресурсы для конкретной страны. Если вам нужно указать только язык, используйте вместо этого квалификатор языка, алфавита (необязательно) и региона (необязательно) . Если вы используете квалификаторы MCC и MNC, делайте это осторожно и проверяйте, работает ли он должным образом.

Также см. поля конфигурации 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 (перед которым стоит строчная буква r ).

Коды не чувствительны к регистру. Префикс r используется для обозначения части региона. Вы не можете указать только регион.

В Android 7.0 (уровень API 24) появилась поддержка языковых тегов BCP 47 , которые можно использовать для квалификации ресурсов, зависящих от языка и региона. Языковой тег состоит из последовательности одного или нескольких вложенных тегов, каждый из которых уточняет или сужает диапазон языка, идентифицируемый общим тегом. Дополнительную информацию о языковых тегах см. в разделе Теги для идентификации языков .

Чтобы использовать языковой тег BCP 47, объедините b+ и двухбуквенный код языка ISO 639-1 , за которым при необходимости могут следовать дополнительные вложенные теги, разделенные + .

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

Полное руководство по локализации вашего приложения для других языков см. в разделе Локализация вашего приложения .

Также см. метод getLocales() , который предоставляет определенный список локалей. Этот список включает основной языковой стандарт.

Направление макета ldrtl
ldltr

Направление макета вашего приложения. ldrtl означает «направление макета справа налево». ldltr означает «направление макета слева направо» и является неявным значением по умолчанию.

Это может применяться к любому ресурсу, например макетам, объектам рисования или значениям.

Например, если вы хотите предоставить специальную раскладку для арабского языка и общую раскладку для любого другого языка с письмом справа налево, например персидского или иврита, вы используете следующие каталоги:

res/
layout/
main.xml (макет по умолчанию)
layout-ar/
main.xml (специальный макет для арабского языка)
layout-ldrtl/
main.xml (любой язык с письмом справа налево, кроме арабского, поскольку квалификатор языка «ar» имеет более высокий приоритет)

Примечание. Чтобы включить функции макета справа налево для вашего приложения, необходимо установить SupportsRtl значение "true" , а для TargetSdkVersion — значение 17 или выше.

Добавлено на уровне API 17.

Наименьшая ширина sw<N>dp

Примеры:
sw320dp
sw600dp
sw720dp
и т. д.

Самый короткий размер области экрана, доступный приложению. В частности, smallestWidth окна приложения — это наименьшая из доступных высоты и ширины окна. Вы также можете думать об этом как о «наименьшей возможной ширине» окна. Вы можете использовать этот квалификатор, чтобы ваше приложение имело ширину не менее <N> dps, доступную для его пользовательского интерфейса.

Например, если ваш макет требует, чтобы наименьший размер области экрана всегда составлял не менее 600 dp, вы можете использовать этот квалификатор для создания ресурсов макета в каталоге res/layout-sw600dp/ . Система использует эти ресурсы только в том случае, если наименьший размер доступного экрана составляет не менее 600 dp, независимо от того, является ли сторона 600 dp высотой или шириной, воспринимаемой пользователем. Наименьшая ширина может измениться, если изменить размер окна, изменить доступную ширину/высоту или переместить его, что может привести к изменению системных вставок.

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

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

Наименьшая ширина устройства учитывает оформление экрана и системный интерфейс. Например, если на экране устройства есть постоянные элементы пользовательского интерфейса, которые занимают пространство вдоль оси наименьшей ширины, система объявляет, что наименьшая ширина меньше фактического размера экрана, поскольку это пиксели экрана, недоступные для вашего пользовательского интерфейса. .

Некоторые значения, которые вы можете использовать здесь для распространенных размеров экрана:

  • 320, для устройств с такими конфигурациями экрана, как:
    • 240x320 ldpi (телефон QVGA)
    • 320x480 mdpi (телефонная трубка)
    • 480x800 HDPI (телефонная трубка высокой плотности)
  • 480, для таких экранов, как 480x800 mdpi (планшет/телефон)
  • 600, для таких экранов, как 600x1024 mdpi (7-дюймовый планшет)
  • 720, для таких экранов, как 720x1280 mdpi (10-дюймовый планшет)

Когда ваше приложение предоставляет несколько каталогов ресурсов с разными значениями квалификатора smallestWidth , система использует тот, который ближе всего (но не превышает) к smallestWidth устройства.

Добавлено на уровне API 13.

Также см. атрибут android:requiresSmallestWidthDp , который объявляет минимальную smallestWidth , с которой совместимо ваше приложение, и поле конфигурации smallestScreenWidthDp , которое содержит smallestWidth значение ширины устройства.

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

Доступная ширина и высота w<N>dp
h<N>dp

Примеры:
w720dp
w1024dp
h720dp
h1024dp
и т. д.

Указывает минимальную доступную ширину или высоту экрана (в единицах dp , определяемых значением <N> ), при которой используется ресурс. Эти значения конфигурации сравниваются с текущей шириной и высотой дисплея при изменении ориентации устройства с книжной на альбомную, при складывании или раскладывании устройства, а также при входе или выходе системы из многооконного режима. В многооконном режиме значения отражают ширину и высоту окна, содержащего приложение, а не ширину и высоту экрана устройства. Аналогично, для встроенных действий значения относятся к ширине и высоте отдельных действий, а не к ширине и высоте экрана. Дополнительные сведения см. в разделе «Внедрение действий» .

Доступная ширина и высота часто полезны для определения того, следует ли использовать многопанельный макет, поскольку даже на планшетном устройстве часто не требуется тот же многопанельный макет для книжной ориентации, что и для альбомной. Таким образом, вы можете использовать их для указания минимальной ширины и/или высоты, необходимой для макета, вместо того, чтобы использовать одновременно размер экрана и квалификаторы ориентации.

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

Значения исключают область, занимаемую вставками Window , поэтому, если устройство имеет постоянные элементы пользовательского интерфейса по краям дисплея, значения ширины и высоты будут меньше реальных размеров экрана, даже если приложение отображается от края до края с использованием Window.setDecorFitsSystemWindows или WindowCompat.setDecorFitsSystemWindows .

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

Примечание. Система выбирает ресурс, соответствующий как по ширине, так и по высоте. Поэтому ресурс, в котором указаны оба параметра, предпочтительнее, чем ресурс, в котором указано только одно или другое. Например, если фактический экран имеет ширину 720 dp и высоту 1 280 dp, а один ресурс квалифицируется как w720dp, а другой — как w700dp-h1200dp, выбирается последний, даже если первый точно соответствует тому, что он указывает.

Добавлено на уровне API 13.

Также см. поля конфигурации screenWidthDp и screenHeightDp , которые содержат текущую ширину и высоту экрана.

Дополнительную информацию о проектировании для разных экранов с использованием этого квалификатора см. в разделе Адаптивный/адаптивный дизайн с представлениями .

Размер экрана small
normal
large
xlarge
  • small : экраны такого же размера, что и экран QVGA низкой плотности. Минимальный размер макета для маленького экрана составляет примерно 320x426 dp. Примерами являются QVGA низкой плотности и VGA высокой плотности.
  • normal : экраны такого же размера, как экран HVGA средней плотности. Минимальный размер макета для обычного экрана составляет примерно 320x470 единиц dp. Примерами таких экранов являются экраны WQVGA низкой плотности, HVGA средней плотности и WVGA высокой плотности.
  • large : экраны такого же размера, как экран VGA средней плотности. Минимальный размер макета для большого экрана составляет примерно 480 x 640 dp. Примерами являются экраны средней плотности VGA и WVGA.
  • xlarge : экраны, которые значительно больше традиционного экрана HVGA средней плотности. Минимальный размер макета для экрана xlarge составляет примерно 720 x 960 dp. В большинстве случаев устройства с очень большими экранами слишком велики, чтобы их можно было носить в кармане, и, скорее всего, они представляют собой устройства типа планшетов. Добавлено на уровне API 9.

Примечание. Использование квалификатора размера не означает, что ресурсы предназначены только для экранов такого размера. Если вы не предоставляете альтернативные ресурсы с квалификаторами, которые лучше соответствуют текущей конфигурации устройства, система может использовать те ресурсы, которые лучше всего подходят .

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

Добавлено в API уровня 4.

Также см. поле конфигурации screenLayout , которое указывает, является ли экран маленьким, нормальным или большим.

Дополнительную информацию см. в разделе Обзор совместимости экранов .

Формат экрана long
notlong
  • long : длинные экраны, такие как WQVGA, WVGA, FWVGA.
  • notlong : недлинные экраны, такие как QVGA, HVGA и VGA.

Добавлено в API уровня 4.

Это основано исключительно на соотношении сторон экрана ( long экран шире). Это не связано с ориентацией экрана.

Также см. поле конфигурации screenLayout , которое указывает, длинный ли экран.

Круглый экран round
notround
  • round : круглые экраны, например, круглое носимое устройство.
  • notround : прямоугольные экраны, такие как телефоны или планшеты.

Добавлено на уровне API 23.

Также см. метод конфигурации isScreenRound() , который указывает, является ли экран круглым.

Широкая цветовая гамма widecg
nowidecg
  • widecg : дисплеи с широкой цветовой гаммой, например Display P3 или AdobeRGB.
  • nowidecg : дисплеи с узкой цветовой гаммой, например sRGB.

Добавлено на уровне API 26.

Также см. метод конфигурации isScreenWideColorGamut() , который указывает, имеет ли экран широкую цветовую гамму.

Широкий динамический диапазон (HDR) highdr
lowdr
  • highdr : дисплеи с высоким динамическим диапазоном
  • lowdr : отображает с низким/стандартным динамическим диапазоном.

Добавлено на уровне API 26.

Также см. метод конфигурации isScreenHdr() , который указывает, поддерживает ли экран возможности HDR.

Ориентация экрана port
land
  • port : устройство находится в книжной ориентации (вертикальной).
  • land : устройство находится в альбомной ориентации (горизонтально).

Это может измениться в течение срока службы вашего приложения, если пользователь поворачивает экран. Сведения о том, как это повлияет на ваше приложение во время выполнения, см. в разделе Обработка изменений конфигурации .

Также см. поле конфигурации orientation , в котором указывается текущая ориентация устройства.

Режим пользовательского интерфейса car
desk
television
appliance
watch
vrheadset
  • car : устройство отображается в автомобильной док-станции.
  • desk : устройство отображается на настольной док-станции.
  • television : устройство отображается на телевизоре, обеспечивая ощущение «десяти футов», когда его пользовательский интерфейс находится на большом экране, от которого пользователь находится далеко, и взаимодействие в основном ориентировано на D-pad или другое взаимодействие без указателя.
  • appliance : устройство работает как прибор, без дисплея
  • watch : устройство имеет дисплей и носится на запястье.
  • vrheadset : устройство отображается в гарнитуре виртуальной реальности.

Добавлен уровень API 8; телевидение добавлено в API 13; часы добавлены в API 20.

Информацию о том, как ваше приложение может реагировать, когда устройство вставляется в док-станцию ​​или вынимается из нее, читайте в статье «Определение и мониторинг состояния стыковки» и введите .

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

Ночной режим night
notnight
  • night : ночное время
  • notnight : дневное время

Добавлено на уровне API 8.

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

Плотность пикселей экрана (точек на дюйм) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnn dpi
  • ldpi : экраны с низкой плотностью; примерно 120 dpi.
  • mdpi : экраны средней плотности (на традиционных HVGA); примерно 160 dpi.
  • hdpi : экраны высокой плотности; примерно 240 точек на дюйм.
  • xhdpi : экраны сверхвысокой плотности; примерно 320 dpi. Добавлено на уровне API 8.
  • xxhdpi : экраны сверхвысокой плотности; примерно 480 dpi. Добавлено на уровне API 16.
  • xxxhdpi : использование с экстра-экстра-экстра-высокой плотностью (только значок запуска — см. Поддержка различных плотностей пикселей ); примерно 640 точек на дюйм. Добавлено на уровне API 18.
  • nodpi : используется для растровых ресурсов, масштабирование которых не требуется в соответствии с плотностью устройства.
  • tvdpi : экраны где-то между mdpi и hdpi; примерно 213 точек на дюйм. Это не считается «основной» группой плотности. Он в основном предназначен для телевизоров с разрешением 720p и большинству приложений он не нужен. Для ТВ-панелей 1080p используйте xhdpi , а для ТВ-панелей 4K — xxxhdpi . Добавлено на уровне API 13.
  • anydpi : соответствует любой плотности экрана и имеет приоритет над другими квалификаторами. Это полезно для векторных изображений . Добавлено на уровне API 21.
  • nnn dpi : используется для представления нестандартных плотностей, где nnn — положительное целое число плотности экрана. В большинстве случаев это не используется. Использование сегментов стандартной плотности значительно снижает затраты на поддержку различных плотностей экрана устройств, представленных на рынке.

Между шестью основными плотностями существует соотношение масштабирования 3:4:6:8:12:16 (без учета плотности tvdpi). Таким образом, растровое изображение 9x9 в ldpi имеет размер 12x12 в mdpi, 18x18 в hdpi, 24x24 в xhdpi и так далее.

Примечание. Использование квалификатора плотности не означает, что ресурсы предназначены только для экранов этой плотности. Если вы не предоставляете альтернативные ресурсы с квалификаторами, которые лучше соответствуют текущей конфигурации устройства, система использует те ресурсы, которые лучше всего подходят .

Дополнительные сведения о том, как обрабатывать различные плотности экрана и как Android может масштабировать растровые изображения в соответствии с текущей плотностью, см. в разделе Обзор совместимости экранов .

Тип сенсорного экрана notouch
finger
  • notouch : устройство не имеет сенсорного экрана.
  • finger : устройство имеет сенсорный экран, который предназначен для использования посредством направления пальца пользователя.

Также см. поле конфигурации touchscreen , в котором указан тип сенсорного экрана на устройстве.

Наличие клавиатуры keysexposed
keyshidden
keyssoft
  • keysexposed : на устройстве есть доступная клавиатура. Если на устройстве включена программная клавиатура (что вполне вероятно), она используется, даже если аппаратная клавиатура не видна пользователю или когда устройство не имеет аппаратной клавиатуры. Если программная клавиатура не предусмотрена или она отключена, она используется только при наличии аппаратной клавиатуры.
  • keyshidden : на устройстве доступна аппаратная клавиатура, но она скрыта , и на устройстве не включена программная клавиатура.
  • keyssoft : на устройстве включена программная клавиатура, вне зависимости от того, видна она или нет.

Если вы предоставляете ресурсы keysexposed , но не ресурсы keyssoft , система использует ресурсы keysexposed независимо от того, видна ли клавиатура, если в системе включена программная клавиатура.

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

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

Основной метод ввода текста nokeys
qwerty
12key
  • nokeys : устройство не имеет аппаратных клавиш для ввода текста.
  • qwerty : устройство имеет аппаратную QWERTY-клавиатуру, вне зависимости от того, видна она пользователю или нет.
  • 12key : устройство имеет аппаратную 12-клавишную клавиатуру, видимую она пользователю или нет.

Также см. поле конфигурации keyboard , в котором указан основной доступный метод ввода текста.

Версия платформы (уровень API) Примеры:
v3
v4
v7
и т. д.

Уровень API, поддерживаемый устройством. Например, v1 для уровня API 1 (устройства с Android 1.0 или более поздней версии) и v4 для уровня API 4 (устройства с Android 1.6 или более поздней версии). Дополнительные сведения об этих значениях см. в документе «Уровни API Android» .

Примечание. Не все версии 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 .

Система приходит к своему решению, для каких ресурсов использовать со следующей логикой:

Рисунок 2. Блок-схема того, как Android находит лучший ресурс.

  1. Устранение файлов ресурсов, которые противоречат конфигурации устройства.

    Справочник 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. Найдите квалификатор следующего самого высокого предстоящего в списке ( Таблица 2 ). (Начните с MCC.)
  3. Есть ли какой -либо из каталогов ресурсов, включающий этот квалификатор?
    • Если нет, вернитесь ко второму шагу и посмотрите на следующий квалификатор. В этом примере ответ «нет» до тех пор, пока не будет достигнут квалификатор языка.
    • Если да, продолжайте на четвертом шаге.
  4. Устранение каталогов ресурсов, которые не включают этот квалификатор. В этом примере система следующая исключает все каталоги, которые не включают языковой квалификатор:
    drawable/
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    drawable-port-ldpi/
    drawable-port-notouch-12key/
    

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

  5. Повторите шаги два, три и четыре, пока не останется только один каталог. В этом примере ориентация экрана является следующим отборочным средством, для которого есть какие -либо совпадения. Таким образом, ресурсы, которые не указывают ориентацию на экран, устраняются:
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    

    Оставшийся каталог drawable-en-port .

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

При выборе ресурсов, основанных на квалификаторах размера экрана, система использует ресурсы, предназначенные для экрана, меньше текущего экрана, если нет ресурсов, которые лучше соответствуют. Например, экран большого размера использует ресурсы экрана нормального размера, если это необходимо.

Однако, если единственные доступные ресурсы больше текущего экрана, система не использует их, а ваше приложение сбоя, если никакие другие ресурсы не соответствуют конфигурации устройства. Это происходит, например, если все ресурсы макета помечены квалификатором xlarge , но устройство является экраном нормального размера.

Примечание. Приоритет квалификатора (в таблице 2 ) важнее, чем количество квалификаторов, которые точно соответствуют устройству. В предыдущем примере, на четвертом этапе последний выбор в списке включает в себя три отборочных, которые точно соответствуют устройству (ориентация, тип сенсорного экрана и метод ввода), в то время как drawable-en имеет только один параметр, который соответствует языку). Тем не менее, язык имеет более высокий приоритет, чем эти другие квалификации, поэтому устранен устранена drawable-port-notouch-12key .