Вариации файла компоновки
Для извлечения нужного ресурса по его идентификатору Android использует специальный алгоритм. Почитайте статьи, приведенные в разделе “Ссылки”, чтобы разобраться в этих правилах, а здесь мы приведем только самые ходовые.
Главное правило звучит так: квалификаторы, перечисленные ранее, расположены в порядке старшинства. Предположим, что есть каталоги, приведенные в листинге 3.38.
Листинг 3.38. Вариации файла компоновки
\res\layout\main layout.xml \res\layout-port\main layout.xml \res\layout-en\main layout.xml
В листинге 3.38 файл компоновки main_layout.xml доступен в двух дополнительных вариациях. Одна вариация предназначена для языка, а другая — для режима компоновки. Рассмотрим, как выбирается файл компоновки при портретной ориентации устройства. Несмотря на портретный режим, Android выбирает компоновку из каталога layout-en, т.к. языковая вариация находится ранее вариации положения в списке квалификаторов конфигурации. Ссылки по SDK, упомянутые в разделе “Ссылки” в конце главы, содержат списки всех квалификаторов конфигурации и порядок их старшинства.
Рассмотрим правила предшествования на примере нескольких строковых ресурсов. Учтите, что строковые ресурсы основаны на индивидуальных идентификаторах, а ресурсы компоновок — на именах файлов. Чтобы проверить порядок квалификаторов конфигурации для строковых ресурсов, возьмем пять идентификаторов ресурсов, которые могут встречаться в следующих вариациях: по умолчанию, en, en_us, port и en_port. Ниже кратко описаны эти пять идентификаторов ресурсов.
• teststring_all — этот идентификатор находится во всех вариациях в каталоге values, включая вариацию по умолчанию.
• testport_port — находится только в вариации по умолчанию и вариации -port.
• t1_enport — находится в вариации по умолчанию и в вариациях -en и -port.
• t1_1_en_port — находится в вариации по умолчанию и в en-port.
• t2 — находится только в вариации по умолчанию.
Сразу же легко заметить, что несмотря на наличие множества строк, сгенерировано только пять идентификаторов строковых ресурсов. Поведение этих строковых значений при их выборке описано ниже (для локали en_US и портретного режима).
• teststring_all. Для этого идентификатора доступны все пять вариаций из каталога values. В силу этого будет выбрана вариация из каталога values-en-rUS. На основании правил предшествования конкретный язык может указывать на вариации по умолчанию, en, port и en-port.
• testport_port. Доступен в вариации по умолчанию и в вариации -port. Поскольку этот идентификатор отсутствует во всех каталогах с именами, начинающимися на -en, вариация -port будет иметь приоритет больше, чем вариация по умолчанию, и будет взято значение из -port. Если бы идентификатор присутствовал хотя бы в одной вариации -en, значение было бы взято оттуда.
• t1_enport. Доступен в трех вариациях: по умолчанию, -en и -port. При наличии и в -en, и в -port значение берется из -en.
• t1_1_en_port. Доступен в четырех вариациях: по умолчанию, -port, -en и -en-port. Так как идентификатор присутствует в -en-port, он будет выбран оттуда, а вариации по умолчанию, -en и -port игнорируются.
• t2. Находится только в вариации по умолчанию, откуда и выбирается значение.
Алгоритм в Android SDK несколько сложнее, тем не менее, приведенный выше пример дает хорошее представление о нем. Главное — задать старшинство вариаций. Для этой статьи по SDK в следующем разделе приведена ссылка. Там же указан URL-адрес для загрузки импортируемого проекта для этой главы, который можно использовать для проведения экспериментов с вариациями конфигурации.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.