page.title=Предоставление ресурсов parent.title=Ресурсы приложения parent.link=index.html @jd:body
Обязательно необходимо экспортировать из кода ресурсы приложения, такие как изображения и строки, для последующей их независимой обработки. Следует также обеспечить альтернативные ресурсы для определенных конфигураций устройств, группируя их в каталогах ресурсов со специальными именами. В режиме выполнения Android использует соответствующие ресурсы с учетом текущей конфигурации. Например, можно предоставлять другой макет пользовательского интерфейса в зависимости от размера экрана или различные строки в зависимости от настройки языка.
После выполнения экспорта ресурсов приложения можно обращаться к ним с помощью идентификаторов ресурсов, которые генерируются в классе {@code R} вашего проекта. Использование ресурсов в приложении рассмотрено в разделе Доступ к ресурсам. В этом документе показано, как группировать ресурсы в проекте Android и предоставлять альтернативные ресурсы для определенных конфигураций устройств.
Следует поместить ресурсы каждого типа в определенный подкаталог каталога {@code res/} вашего проекта. В качестве примера приведена иерархия файлов для простого проекта:
MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml
Как видно в этом примере, каталог {@code res/} содержит все ресурсы (в подкаталогах): ресурс-изображение, два ресурса-макета, каталоги {@code mipmap/} для значков запуска и файл строк. Имена каталогов ресурсов очень важны и описаны в таблице 1.
Примечание. Подробные сведения об использовании папок множественного отображения см. в разделе Обзор управления проектами.
Каталог | Тип ресурсов |
---|---|
animator/ |
Файлы XML, которые определяют анимации свойств. |
anim/ |
Файлы XML, которые определяют анимации преобразований. (Анимации свойств также можно сохранять в этом каталоге, но для анимаций свойств предпочтительнее использовать каталог {@code animator/}, чтобы различать эти два типа). |
color/ |
Файлы XML, которые определяют список состояний цветов. См. раздел Ресурс списка состояний цветов |
drawable/ |
Файлы растровых изображений ({@code .png}, {@code .9.png}, {@code .jpg}, {@code .gif}) или файлы XML, которые составляют следующие подтипы графических ресурсов:
См. раздел Графические ресурсы. |
mipmap/ |
Графические файлы для значков запуска с различной плотностью. Подробные сведения об управлении значками запуска с помощью папок {@code mipmap/} см. в разделе Обзор управления проектами. |
layout/ |
Файлы XML, которые определяют макет пользовательского интерфейса. См. раздел Ресурсы макетов. |
menu/ |
Файлы XML, которые определяют меню приложения, такие как меню параметров, контекстные меню или вложенные меню. См. раздел Ресурсы меню. |
raw/ |
Произвольные файлы для сохранения в исходной форме. Чтобы открыть эти ресурсы с помощью {@link java.io.InputStream}, вызовите {@link android.content.res.Resources#openRawResource(int) Resources.openRawResource()} с идентификатором ресурса, который имеет вид {@code R.raw.filename}. Однако, если требуется получить доступ к исходным именам файлов и иерархии файлов, можно сохранять некоторые ресурсы в каталоге {@code assets/} (вместо каталога {@code res/raw/}). Файлы в каталоге {@code assets/} не получают идентификатора ресурса, поэтому их чтение возможно только с помощью {@link android.content.res.AssetManager}. |
values/ |
Файлы XML, которые содержат простые значения, такие как строки, целые числа и цвета. Тогда как XML-файлы ресурсов в других подкаталогах каталога {@code res/} определяют отдельные ресурсы на базе имени файла XML, файлы в каталоге {@code values/} описывают несколько ресурсов. Для файла в этом каталоге каждый дочерний элемент элемента {@code <resources>} определяет один ресурс. Например, элемент {@code <string>} создает ресурс {@code R.string}, а элемент {@code <color>} создает ресурс {@code R.color} . Так как каждый ресурс определяется с помощью своего собственного элемента XML, можно назначать имя файла по своему усмотрению и помещать ресурсы разных типов в один файл. Тем не мене, может появиться необходимость поместить ресурсы отдельных типов в разные файлы. Например, ниже приведены соглашения для имен файлов ресурсов, которые можно создать в этом каталоге:
См. разделы Строковые ресурсы, Ресурсы стиля и Дополнительные типы ресурсов. |
xml/ |
Произвольные XML-файлы, которые можно читать в режиме выполнения вызовом метода {@link android.content.res.Resources#getXml(int) Resources.getXML()}. Здесь должны сохраняться различные файлы конфигурации XML, например, конфигурация с возможностью поиска. |
Предупреждение! Не сохраняйте файлы ресурсов непосредственно в каталоге {@code res/}, так как это вызывает ошибку компилятора.
Дополнительную информацию об определенных типах ресурсов см. в документации Типы ресурсов.
Ресурсы, сохраненные в подкаталогах, которые описаны в таблице 1, являются ресурсами «по умолчанию». Таким образом, эти ресурсы определяют дизайн и содержимое приложения по умолчанию. Однако различные типы устройств Android могут вызывать различные типы ресурсов. Например, если устройство оснащено экраном больше нормального, следует предоставить другие ресурсы макета, которые будут использовать преимущества дополнительного места на экране. Или, если устройство содержит различные языковые настройки, следует предоставить другие строковые ресурсы, содержащие перевод текста пользовательского интерфейса. Чтобы предоставить разные ресурсы для разных конфигураций устройств, необходимо предоставить альтернативные ресурсы в дополнение к ресурсам по умолчанию.
Почти каждое приложение должно предоставлять альтернативные ресурсы, чтобы поддерживать определенные конфигурации устройств. Например, необходимо включить альтернативные графические ресурсы для экранов с разной плотностью растра и альтернативные ресурсы для разных языков. В режиме выполнения Android определяет конфигурацию устройства и загружает соответствующие ресурсы для приложения.
Чтобы указать альтернативы для конкретных конфигураций набора ресурсов, выполните следующие действия:
Можно добавлять несколько квалификаторов {@code <qualifier>}. Разделяйте их знаком дефиса.
Предупреждение! При добавлении нескольких квалификаторов необходимо располагать их в том же порядке, в котором они перечислены в таблице 2. Если порядок квалификаторов нарушен, ресурсы игнорируются.
В качестве примера здесь приведено несколько ресурсов по умолчанию и альтернативных ресурсов:
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
Квалификатор {@code hdpi} указывает, что ресурсы в этом каталоге предназначены для устройств, оснащенных экраном высокой плотности. Изображения в каждом из этих каталогов для графических объектов имеют размер для определенной плотности экрана, но имена файлов полностью совпадают. Таким образом, идентификатор ресурса, который указывает на изображение {@code icon.png} или {@code background.png}, всегда одинаков, но Android выбирает версию каждого ресурса, которая оптимально соответствует текущему устройству, сравнивая информацию о конфигурации устройства с квалификаторами в имени каталога ресурсов.
Android поддерживает несколько квалификаторов конфигурации, позволяя добавлять несколько квалификаторов к одному имени каталога, разделяя квалификаторы дефисом. В таблице 2 перечислены допустимые квалификаторы конфигурации в порядке приоритета — если используется несколько квалификаторов для каталога ресурсов, необходимо добавлять их к имени каталога в том порядке, в котором они перечислены в таблице.
Конфигурация | Значения квалификатора | Описание |
---|---|---|
MCC и MNC | Примеры:mcc310
mcc208-mnc00 и т. д. |
Код страны для мобильной связи (MCC), за которым может следовать код сети мобильной связи (MNC)
из SIM-карты устройства. Например, Если в устройстве используется радиосвязь (телефон GSM), значения MCC и MNC добываются из SIM-карты. Можно также использовать только код MCC (например, для включения в приложении разрешенных в стране ресурсов). Если требуется указать только язык, используйте квалификатор язык и регион (обсуждается ниже). Если принято решение использовать квалификатор MCC и MNC, следует делать это с осторожностью и проверить корректность его работы. См. также поля конфигурации {@link android.content.res.Configuration#mcc} и {@link android.content.res.Configuration#mnc}, которые указывают текущий код страны при мобильной связи и код сети мобильной связи соответственно. |
Язык и регион | Примеры:en fr en-rUS fr-rFR fr-rCA и т. д. |
Язык задается двухбуквенным кодом языка ISO 639-1, к которому можно добавить двухбуквенный код региона ISO 3166-1-alpha-2 (которому предшествует строчная буква "{@code r}"). Коды не зависят от регистра; префикс {@code r} служит для обозначения кода региона. Нельзя указывать только код региона. Он может измениться за время работы приложения, если пользователь изменяет свой язык в системных настройках. В разделе Обработка изменений в режиме выполнения содержится информация о воздействии таких изменений на приложение во время выполнения. В разделе Локализация приведено полное руководство по локализации приложения для других языков. См. также поле конфигурации {@link android.content.res.Configuration#locale}, которое указывает текущий язык. |
Направление макета | ldrtl ldltr |
Направление макета для приложения. Квалификатор {@code ldrtl} означает «направление макета справа налево». Квалификатор {@code ldltr} означает «направление макета слева направо» и используется по умолчанию. Эти квалификаторы можно применять к любым ресурсам, таким как макеты, графические элементы или значения. Например, если требуется предоставить специальный макет для арабского языка и общий макет для других языков, использующих написание «справа налево» (таких как фарси или иврит), используйте следующий код: res/ layout/ main.xml (Default layout) layout-ar/ main.xml (Specific layout for Arabic) layout-ldrtl/ main.xml (Any "right-to-left" language, except for Arabic, because the "ar" language qualifier has a higher precedence.) Примечание. Чтобы включить в приложение функцию макета «справа налево», необходимо установить для параметра {@code supportsRtl} значение {@code "true"} и для параметра {@code targetSdkVersion} значение 17 или больше. Добавлено в API уровня 17. |
smallestWidth | sw<N>dp Примеры: sw320dp sw600dp sw720dp и т. д. |
Основной размер экрана, указывающий минимальный размер доступной области экрана. Точнее говоря, минимальная ширина устройства – это наименьший из двух размеров экрана: высоты и ширины (можно также называть ее «меньшей стороной» экрана). Этот квалификатор позволяет гарантировать, что независимо от текущей ориентации экрана приложение имеет доступную ширину пользовательского интерфейса не менее {@code <N>} пикселов. Например, если для макета требуется, чтобы минимальный размер области экрана всегда был не менее 600 пикселов, можно использовать этот квалификатор для создания ресурсов этого макета, {@code res/layout-sw600dp/}. Система будет использовать эти ресурсы только в том случае, если минимальный размер доступной области экрана составляет не менее 600 пикселов, независимо от воспринимаемой пользователем высоты или ширины. Значение минимальной ширины является постоянной характеристикой размера экрана для устройства; минимальная ширина устройства не изменяется при изменении ориентации экрана. Минимальная ширина устройства учитывает оформление экрана и пользовательский интерфейс системы. Например, если не экране присутствуют постоянные элементы пользовательского интерфейса, которые занимают пространство вдоль оси минимальной ширины, система объявляет, что минимальная ширина меньше фактического размера экрана, так как эти пикселы экрана недоступны для пользовательского интерфейса приложения. Следовательно используемое значение должно быть фактическим наименьшим размером, который необходим для вашего макета (обычно это значение является «минимальной шириной», которую поддерживает ваш макет, независимо от текущей ориентации экрана). Здесь приведены некоторые значения, которые можно использовать для экранов обычных размеров:
Когда приложение предоставляет несколько каталогов ресурсов с разными значениями квалификатора «минимальная ширина», система использует квалификатор, ближайший к минимальной ширине устройства, но не превышающий ее. Добавлено в API уровня 13. См. также атрибут {@code android:requiresSmallestWidthDp}, который объявляет минимальную ширину, совместимую с вашим приложением, и поле конфигурации {@link android.content.res.Configuration#smallestScreenWidthDp}, которое содержит значение минимальной ширины устройства. Дополнительную информацию о разработке для различных экранов и использовании этого квалификатора см. в руководстве разработчика Поддержка нескольких экранов. |
Доступная ширина | w<N>dp Примеры: w720dp w1024dp и т. д. |
Указывает минимальную доступную ширину экрана в единицах {@code dp}, для которой должен использоваться ресурс,
заданный значением Когда приложение предоставляет несколько каталогов ресурсов с разными значениями этой конфигурации, система использует ширину, ближайшую к текущей ширине экрана устройства, но не превышающую ее. Это значение учитывает оформление экрана, поэтому, если устройство содержит постоянные элементы пользовательского интерфейса вдоль левого или правого края дисплея, оно использует значение ширины, которое меньше реального размера экрана: эти элементы пользовательского интерфейса учитываются и уменьшают пространство, доступное для приложения. Добавлено в API уровня 13. См. также поле конфигурации {@link android.content.res.Configuration#screenWidthDp} , которое содержит текущую ширину экрана. Дополнительную информацию о разработке для различных экранов и использовании этого квалификатора см. в руководстве разработчика Поддержка нескольких экранов. |
Доступная высота | h<N>dp Примеры: h720dp h1024dp и т. д. |
Указывает минимальную доступную высоту экрана в пикселах, для которой должен использоваться ресурс,
заданный значением Когда приложение предоставляет несколько каталогов ресурсов с разными значениями этой конфигурации, система использует высоту, ближайшую к текущей высоте экрана устройства, но не превышающую ее. Это значение учитывает оформление экрана, поэтому, если устройство содержит постоянные элементы пользовательского интерфейса вдоль верхнего или нижнего края дисплея, оно использует значение высоты, которое меньше реального размера экрана: эти элементы пользовательского интерфейса учитываются и уменьшают пространство, доступное для приложения. Элементы оформления экрана, которые не являются постоянными (например, строка состояния телефона может быть скрыта в полноэкранном режиме), здесь не учитываются; также не учитываются такие элементы оформления окна, как строка заголовка или строка действий, поэтому приложения должны быть готовы к работе с меньшим пространством, чем указано. Добавлено в API уровня 13. См. также поле конфигурации {@link android.content.res.Configuration#screenHeightDp} , которое содержит текущую ширину экрана. Дополнительную информацию о разработке для различных экранов и использовании этого квалификатора см. в руководстве разработчика Поддержка нескольких экранов. |
Размер экрана |
small normal large xlarge
|
Примечание. Использование квалификатора размера не подразумевает, что ресурсы предназначены только для экранов этого размера. Если не предусмотрены альтернативные ресурсы с квалификаторами, лучше подходящими к текущей конфигурации устройства, система может использовать любые наиболее подходящие ресурсы. Предупреждение! Если все ресурсы используют квалификатор размера, который превосходит размер текущего экрана, система не будет использовать эти ресурсы, и приложение аварийно завершится во время выполнения (например, если все ресурсы макета отмечены квалификатором {@code xlarge}, но устройство оснащено экраном нормального размера). Добавлено в API уровня 4. Дополнительную информацию см. в разделе Поддержка нескольких экранов. См. также поле конфигурации {@link android.content.res.Configuration#screenLayout}, которое указывает тип размера экрана: маленький, нормальный или большой. |
Формат экрана |
long notlong
|
Добавлено в API уровня 4. Формат основан исключительно на соотношении сторон экрана («длинный» экран шире). Это не связано с ориентацией экрана. См. также поле конфигурации {@link android.content.res.Configuration#screenLayout}, которое указывает, является ли экран длинным. |
Ориентация экрана |
port land
|
Ориентация может измениться за время работы приложения, если пользователь поворачивает экран. В разделе Обработка изменений в режиме выполнения содержится информация о воздействии таких изменений на приложение во время выполнения. См. также поле конфигурации {@link android.content.res.Configuration#orientation}, которое указывает текущую ориентацию устройства. |
Режим пользовательского интерфейса |
car desk television appliance
watch
|
Добавлено в API уровня 8, телевизор добавлен в API 13, часы добавлены в API 20. Информацию о том, как приложение может реагировать на установку устройства в док-станцию или извлечение из нее, прочитайте документ Определение и мониторинг типа и состояния подключения к док-станции. Подключение может измениться за время работы приложения, если пользователь помещает устройство в док-станцию. Некоторые из этих режимов можно включить или отключить с помощью {@link android.app.UiModeManager}. В разделе Обработка изменений в режиме выполнения содержится информация о воздействии таких изменений на приложение во время выполнения. |
Ночной режим |
night notnight
|
Добавлено в API уровня 8. Этот режим может измениться за время работы, если ночной режим оставлен в автоматическом режиме (по умолчанию), в котором режим изменяется в зависимости от времени суток. Этот режим можно включить или отключить с помощью {@link android.app.UiModeManager}. В разделе Обработка изменений в режиме выполнения содержится информация о воздействии таких изменений на приложение во время выполнения. |
Плотность пикселов на экране (dpi) |
ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi
|
Шесть основных уровней плотности соотносятся как 3:4:6:8:12:16 (если игнорировать плотность tvdpi). Так, растровое изображение 9x9 в ldpi представляется как 12x12 в mdpi, 18x18 в hdpi, 24x24 в xhdpi и т. д. Если графические ресурсы выглядят недостаточно хорошо на телевизоре или других определенных устройствах, и хочется попробовать ресурсы tvdpi, используйте масштабный коэффициент 1,33*mdpi. Например, изображение 100 x 100 пикселов для экранов mdpi должно иметь размер 133 x 133 пиксела для tvdpi. Примечание. Использование квалификатора плотности не подразумевает, что ресурсы предназначены только для экранов этой плотности. Если не предусмотрены альтернативные ресурсы с квалификаторами, лучше подходящими к текущей конфигурации устройства, система может использовать любые наиболее подходящие ресурсы. Дополнительную информацию о том, как обрабатывать различные плотности экранов, и как Android может масштабировать растровые изображения в соответствии текущей плотностью, см. в разделе Поддержка нескольких экранов. |
Тип сенсорного экрана |
notouch finger
|
См. также поле конфигурации {@link android.content.res.Configuration#touchscreen}, которое указывает тип сенсорного экрана устройства. |
Доступность клавиатуры |
keysexposed keyshidden keyssoft
|
Если предоставляются ресурсы Это состояние может измениться за время работы приложения, если пользователь открывает аппаратную клавиатуру. В разделе Обработка изменений в режиме выполнения содержится информация о воздействии таких изменений на приложение во время выполнения. См. также поля конфигурации {@link android.content.res.Configuration#hardKeyboardHidden} и {@link android.content.res.Configuration#keyboardHidden}, которые указывают видимость аппаратной клавиатуры и видимость клавиатуры любого типа (включая экранную), соответственно. |
Основной способ ввода текста |
nokeys qwerty 12key
|
См. также поле конфигурации {@link android.content.res.Configuration#keyboard}, которое указывает основной доступный способ ввода текста. |
Доступность клавиш перемещения |
navexposed navhidden
|
Это состояние может измениться за время работы приложения, если пользователь открывает клавиши перемещения. В разделе Обработка изменений в режиме выполнения содержится информация о воздействии таких изменений на приложение во время выполнения. См. также поле конфигурации {@link android.content.res.Configuration#navigationHidden}, которое указывает, скрыты ли клавиши перемещения. |
Основной несенсорный способ перемещения курсора |
nonav dpad trackball wheel
|
См. также поле конфигурации {@link android.content.res.Configuration#navigation}, которое указывает способ перемещения курсора. |
Версия платформы (уровень API) | Примеры:v3 v4 v7 и т. д. |
Уровень API, поддерживаемый устройством. Например, |
Примечание. Некоторые квалификаторы конфигурации добавлены после версии Android
1.0, поэтому в некоторых версиях Android поддерживаются не все квалификаторы. При использовании нового квалификатора косвенно
добавляется квалификатор версии платформы, чтобы более старые устройства игнорировали его. Например, при использовании
квалификатора w600dp
автоматически добавляется квалификатор v13
, так как квалификатор
доступной ширины был новым в API уровня 13. Чтобы исключить какие-либо проблемы, всегда включайте набор
ресурсов по умолчанию (набор ресурсов без квалификаторов). Для получения дополнительной информации см.
раздел Обеспечение оптимальной совместимости устройства с
ресурсами.
Здесь приведены некоторые правила использования имен квалификаторов:
drawable-en-rUS-land
применяется к устройствам в США, на английском языке в альбомной
ориентации.drawable-hdpi-port/
drawable-port-hdpi/
res/drawable/drawable-en/
.drawable-rES-rFR/
. Вместо этого необходимо создать два каталога ресурсов, например,
drawable-rES/
и drawable-rFR/
, которые содержат соответствующие файлы.
Однако не обязательно фактически копировать одинаковые файлы в оба каталога. Вместо этого
можно создать псевдоним для ресурса. См. раздел Создание
псевдонимов ресурсов ниже.После сохранения альтернативных ресурсов в каталоги с именами этих квалификаторов Android автоматически применяет ресурсы в приложении на основе текущей конфигурации устройства. При каждом запросе ресурсов Android проверяет каталоги альтернативных ресурсов, которые содержат файл запрошенного ресурса, затем находят наиболее подходящий ресурс (обсуждается ниже). Если нет альтернативных ресурсов, которые соответствуют конкретной конфигурации устройства, Android использует ресурсы по умолчанию (набор ресурсов для конкретного типа ресурсов, которые не содержат квалификатора конфигурации).
Ресурс, предназначенный для нескольких конфигураций устройства (но не являющийся ресурсом по умолчанию), следует помещать только в один каталог альтернативных ресурсов. Вместо этого можно (в некоторых случаях) создать альтернативный ресурс, действующий в качестве псевдонима для ресурса, сохраненного в каталоге ресурсов по умолчанию.
Примечание. Не все ресурсы предлагают механизм, позволяющий создавать псевдоним для другого ресурса. В частности, анимации, меню, необработанные и другие неустановленные ресурсы в каталоге {@code xml/} не содержат такой возможности.
Например, представьте, что имеется значок приложения, {@code icon.png}, и требуется иметь уникальные версии этого значка для разных языков. Однако в двух языках, канадском английском и канадском французском, требуется использовать одинаковую версию. Можно предположить, что требуется скопировать одно изображение в каталоги ресурсов для обоих языков, но это неверно. Вместо этого можно сохранить изображение для обоих языков, как {@code icon_ca.png} (любое имя, кроме {@code icon.png}), и поместить его в каталог по умолчанию {@code res/drawable/}. Затем создайте файл {@code icon.xml} в каталогах {@code res/drawable-en-rCA/} и {@code res/drawable-fr-rCA/} который ссылается на ресурс {@code icon_ca.png} с помощью элемента {@code <bitmap>}. Это позволяет хранить только одну версию файла PNG и два маленьких файла XML, которые указывают на него. (Пример файла XML показан ниже.)
Чтобы создать псевдоним для существующего графического объекта, используйте элемент {@code <bitmap>}. Например:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon_ca" />
Если сохранить этот файл под именем {@code icon.xml} (в каталоге альтернативных ресурсов, например, {@code res/drawable-en-rCA/}), он компилируется в ресурс, на который можно ссылаться с помощью {@code R.drawable.icon}, но фактически он является псевдонимом для ресурса {@code R.drawable.icon_ca} (который сохранен в каталоге {@code res/drawable/}).
Чтобы создать псевдоним для существующего макета, используйте элемент {@code <include>} , заключенный в теги {@code <merge>}. Например:
<?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge>
Если сохранить этот файл под именем {@code main.xml}, он компилируется в ресурс, на который можно ссылаться с помощью {@code R.layout.main}, но фактически он является псевдонимом для ресурса {@code R.layout.main_ltr} .
Чтобы создать псевдоним для существующей строки используйте идентификатор ресурса нужной строки в качестве значения для новой строки. Например:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
Ресурс {@code R.string.hi} теперь является псевдонимом для {@code R.string.hello}.
Другие простые значения работают аналогично. Например, цвет:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="yellow">#f00</color> <color name="highlight">@color/red</color> </resources>
Для того чтобы приложение поддерживало несколько конфигураций устройств, очень важно всегда предоставлять ресурсы по умолчанию для каждого типа ресурсов, используемых приложением.
Например, если приложение поддерживает несколько языков, всегда включайте каталог {@code values/} (в котором сохранены строки) без квалификатора языка и региона. Если вместо этого поместить все файлы строк в каталоги с квалификаторами языка и региона, приложение закроется с ошибкой при запуске на устройстве, на котором установлен язык, отсутствующий в ваших строках. Но как только вы предоставили ресурсы {@code values/} по умолчанию, приложение будет работать правильно (даже если пользователь не понимает этого языка, это лучше, чем завершение с ошибкой).
Таким же образом, если вы предоставляете различные ресурсы макета в зависимости от ориентации экрана, следует указать одну ориентацию в качестве ориентации по умолчанию. Например, вместо предоставления ресурсов макета в каталоге {@code layout-land/} для альбомной ориентации и в каталоге {@code layout-port/} для книжной ориентации, оставьте один вариант по умолчанию: например, {@code layout/} для альбомной и {@code layout-port/} для книжной ориентации.
Предоставление ресурсов по умолчанию важно не только потому, что приложение сможет работать на конфигурации, которую вы не предусмотрели, но также и потому, что новые версии Android иногда добавляют квалификаторы конфигураций, которые не поддерживаются более старыми версиями. Если вы используете новый квалификатор ресурсов, но поддерживаете совместимость кода с более старыми версиями Android, то при выполнении вашего приложения в более старой версии Android оно завершится в ошибкой, если вы не предусмотрели ресурсы по умолчанию, так как оно не может использовать ресурсы, проименованные новым квалификатором. Например, если для параметра {@code minSdkVersion} установлено значение 4 и вы квалифицировали все графические ресурсы с использованием ночного режима ({@code night} или {@code notnight}, который был добавлен в API уровня 8), то устройства с API уровня 4 не смогут получить доступ к графическим ресурсам и приложение завершится с ошибкой. В этом случае, вероятно, следует использовать {@code notnight} в качестве ресурсов по умолчанию и исключить этот квалификатор, разместив графические ресурсы в каталогах {@code drawable/} или {@code drawable-night/}.
Поэтому для обеспечения оптимальной совместимости с устройствами обязательно предоставляйте ресурсы по умолчанию, которые приложение может правильно выполнять. Затем создайте альтернативные ресурсы для определенных конфигураций устройств с помощью квалификаторов конфигурации.
Из этого правила есть одно исключение: Если в приложении для параметра {@code minSdkVersion} установлено значение 4 или выше, не требуется предоставлять графические ресурсы по умолчанию при предоставлении альтернативных графических ресурсов с квалификатором плотность экрана. Даже без графических ресурсов по умолчанию Android может найти наиболее подходящую альтернативную плотность экрана и масштабировать растровые изображения при необходимости. Однако для оптимальной работы на устройствах всех типов следует предоставить альтернативные графические ресурсы для всех трех типов плотности.
Когда вы запрашиваете ресурс, для которого предоставлена альтернатива, Android выбирает альтернативный ресурс для использования в режиме выполнения в зависимости от текущей конфигурации устройства. Чтобы продемонстрировать, как Android выбирает альтернативный ресурс, допустим, что имеются следующие каталоги графических ресурсов, каждый из которых содержит различные версии одинаковых изображений:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
И допустим, что устройство имеет следующую конфигурацию:
Язык = en-GB
Ориентация экрана = port
Плотность пикселов на экране = hdpi
Тип сенсорного экрана = notouch
Основной способ ввода текста = 12key
Сравнивая конфигурацию устройства с доступными альтернативными ресурсами, Android выбирает графику из каталога {@code drawable-en-port}.
Система приходит к решению об используемых ресурсах на основе следующей логики:
Каталог 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/
не исключается, так как на этом этапе любая плотность экрана
считается подходящей. Более подробная информация доступна в документе Поддержка нескольких
экранов.
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/
Остается каталог {@code drawable-en-port}.
Хотя эта процедура выполняется для каждого запрошенного ресурса, система дополнительно оптимизирует некоторые вопросы. Одна из таких оптимизаций состоит в том, что поскольку конфигурация устройства известна, можно исключить альтернативные ресурсы, которые не могут подойти. Например, если используется конфигурация с английским языком ("en"), все каталоги ресурсов, для которых установлен другой квалификатор языка, никогда не включаются в пул проверяемых ресурсов (хотя каталоги ресурсов без квалификатора языка включаются).
При выборе ресурсов на основе квалификаторов размера экрана система будет использовать ресурсы предназначенные для экрана, меньшего чем текущий экран, если нет более подходящих ресурсов (например, на экранах большого размера при необходимости будут использоваться ресурсы, предназначенные для экранов нормального размера). Однако, если единственные доступные ресурсы превосходят размер текущего экрана, система не будет использовать эти ресурсы, и приложение аварийно завершится, если нет других ресурсов, соответствующих конфигурации устройства (например, если все ресурсы макета отмечены квалификатором {@code xlarge}, но устройство оснащено экраном нормального размера).
Примечание. Приоритет квалификатора (в таблице 2) более важен,
чем число квалификаторов, которые точно соответствуют устройству. Например, на шаге 4 выше, последний
вариант в списке содержит три квалификатора, которые точно соответствуют устройству (ориентация, тип
сенсорного экрана и способ ввода), в то время как drawable-en
содержит только один подходящий параметр
(язык). Однако язык имеет более высокий приоритет, чем эти остальные квалификаторы, поэтому
drawable-port-notouch-12key
вычеркивается.
Для получения более подробной информации об использовании ресурсов в приложении перейдите к разделу Доступ к ресурсам.