Android hdpi что это такое

Содержание
  1. Русские Блоги
  2. Android hdpi ldpi mdpi xhdpi xxhdpi подробная адаптация
  3. Ресурсы
  4. Основы
  5. Перечисление основных ресурсов Android
  6. Идентификаторы
  7. Строковые ресурсы
  8. Продвинутые приёмы работы со строковыми ресурсами
  9. Числовые ресурсы
  10. Ресурсы меню
  11. Ресурсы разметки
  12. Синтаксис ссылок на ресурсы
  13. Определение собственных идентификационных номеров ресурсов для последующего использования
  14. Цветовые ресурсы
  15. Ресурсы размеров
  16. Ресурсы визуальных стилей и тем
  17. res/drawable
  18. Ресурсы отрисовываемых цветов
  19. Mipmap
  20. Ресурсы анимации
  21. Ресурсы массивов
  22. Скомпилированные и нескомпилированные ресурсы Android
  23. XML-документы
  24. Использование необработанных ресурсов RAW
  25. Использование ресурсов в коде программы
  26. Получить идентификатор ресурса по его имени
  27. Вложенные ресурсы
  28. Использование системных ресурсов
  29. Создание ресурсов для локализации и аппаратных конфигураций
  30. Корректные варианты
  31. Некорректные варианты
  32. Псевдонимы (alias)
  33. Получение идентификаторов ресурсов приложения

Русские Блоги

Android hdpi ldpi mdpi xhdpi xxhdpi подробная адаптация

1. Понять несколько понятий
(1) Разрешение. Разрешение — это количество пикселей на экране мобильного телефона, которое обычно определяется как «ширина х высота» экрана. Общие разрешения для экранов телефонов Android: 480 × 800, 720 × 1280, 1080 × 1920 и т. Д. 720 × 1280 указывает, что этот экран имеет 720 пикселей в направлении ширины и 1280 пикселей в направлении высоты.
(2) Размер экрана. Размер экрана — это физический размер диагонали телефона, в дюймах. Например, определенный мобильный телефон представляет собой «5-дюймовый мобильный телефон с большим экраном», который относится к диагонали размером 5 дюймов × 2,54 см / дюйм = 12,7 см.

(3) Плотность (точек на дюйм, точек на дюйм; или PPI, пикселей на дюйм). Как следует из названия на английском языке, это количество пикселей на дюйм. Чем выше значение, тем более деликатный дисплей. Если мы знаем, что разрешение мобильного телефона составляет 1080 × 1920, а размер экрана составляет 5 дюймов, можете ли вы рассчитать плотность этого экрана? Ха-ха, теорема Пифагора в средней школе пригодилась! Через ширину 1080 и высоту 1920, согласно теореме Пифагора, мы получили, что число диагональных пикселей составляет приблизительно 2203. Тогда плотность этого экрана делится на 2203 на 5. Результат вычисления — 440. Экран 440 точек на дюйм довольно деликатный. ,

2. Фактическая плотность и плотность системы
В других местах я не нашел слов «фактическая плотность» и «плотность системы». Позвольте мне определить их на данный момент.
«Фактическая плотность» — это плотность, которую мы сами рассчитали. Эта плотность представляет фактическую тонкость экрана. Например, 440 точек на дюйм в приведенном выше примере — это фактическая плотность, указывающая, что этот экран имеет 440 на дюйм. пиксели. Плотность экрана 5 дюймов с разрешением 1080 × 1920 составляет 440, а плотность экрана 4,5 дюйма с тем же разрешением составляет 490. С этой точки зрения, плотность экрана будет много значений, показывая серьезную фрагментацию. А плотность — это основа для экрана Android для увеличения интерфейса, так как же Android адаптируется к такому количеству экранов?
Фактически каждый экран телефона Android имеет начальную фиксированную плотность. Это значения 120, 160, 240, 320 и 480. Мы называем их «системная плотность». Вы нашли, что нет никаких правил? Между значениями разделения существует двоякая связь. Обычно экран 240 × 320 имеет низкую плотность 120 точек на дюйм, то есть ldpi, экран 320 × 480 имеет среднюю плотность 160 точек на дюйм, то есть mdpi, экран 480 × 800 — это плотность 240 точек на дюйм, то есть hdpi, экран 720 × 1280 — супер Высокая плотность 320 точек на дюйм, а именно xhdpi; 1080 × 1920 экран сверхвысокой плотности 480 точек на дюйм, а именно xxhdpi.
Android масштабирует элементы интерфейса на основе плотности системы, а не фактической плотности.

3. Важная единица дп
dp также можно записать как dip, то есть независимый от плотности пиксель. Вы можете себе представить, что dp больше похож на физический размер: например, картинка с шириной и высотой 100dp «выглядит» размером с телефоны 320×480 и 480×800. В действительности их значения пикселей не совпадают. Размер dp как раз такого размера, независимо от плотности экрана, одни и те же элементы размера dp на экране всегда выглядят почти одинаково.
Кроме того, в качестве размера текста используется sp, что является аббревиатурой от независимого от масштаба пикселя. Таким образом, при настройке размера шрифта в системных настройках текст в приложении также будет становиться все больше и меньше.

4, преобразование dp и px
В Android экран мобильного телефона средней плотности с системной плотностью 160 точек на дюйм является базовым экраном, то есть экраном мобильного телефона 320 × 480. На этом экране 1dp = 1px.
100dp — это 100px в 320 × 480 (т / д, 160 т / д). Итак, сколько стоит 100dp на телефоне 480 × 800 (hdpi, 240dpi)? Мы знаем, что 100dp выглядит почти одинаково на обоих телефонах. Согласно соотношению между 160 и 240, мы можем знать, что при 480 × 800 100dp фактически покрывает 150px. Поэтому, если вы предоставите изображение с разрешением 100px для телефона с разрешением MDPI, оно будет растягиваться до 150px на телефоне с разрешением HDMI, но все они имеют разрешение 100 точек на дюйм.
Кажется, что коэффициенты масштабирования средней и высокой плотности можно рассчитать не по 160dpi и 240dpi, а также по 320px и 480px. Однако вычисление коэффициента масштабирования на основе ширины не подходит для сверхвысокой плотности xhdpi и сверхвысокой плотности xxhdpi. То есть, сколько пикселей составляет 1 дп при 720 × 1280? Если вы используете 720/320, вы получите 1dp = 2.25px, что на самом деле неверно. Преобразование между dp и px основано на плотности системы.Плотность системы 720 × 1280 равна 320, а плотность системы 320 × 480 равна 160. 320/160 = 2, затем в 720 × 1280, 1dp = 2px. Аналогично, в 1080 × 1920, 1dp = 3px.
Вы можете запомнить следующее соотношение, преобразование между dp и px очень просто!
ldpi: mdpi: hdpi: xhdpi: xxhdpi = 3: 4: 6: 8: 12, мы обнаружили, что между разделенными числами все еще существует двойная связь. Расчет основан на МДПИ. Например, в 720 × 1280 (xhdpi), сколько пикселей равно 1 dp? Соотношение между mdpi равно 4, а xhdpi равно 8,2 раза, то есть 1dp = 2px. Напротив, расчет важнее: например, если вы используете PhotoShop для создания карты эффекта интерфейса на холсте 720 × 1280, расстояние между двумя элементами составляет 20 пикселей. Сколько dp следует отметить? Удвойте отношения, это 10dp!

Когда размер шрифта системы Android установлен на «нормальный», преобразование размеров между sp и px и dp и px одинаково. Например, если размер текста составляет 24px на холсте с разрешением 720 × 1280 PS, сообщите инженеру, что размер текста составляет 12sp.

5. Рекомендуется отобразить в xdhpi
В телефонах Android так много экранов, какой экран использовать для рисования? Нет необходимости предоставлять набор материалов для мобильных телефонов различной плотности, в большинстве случаев достаточно одного набора.
Теперь более высокое разрешение мобильного телефона составляет 1080 × 1920. Вы можете выбрать этот размер для рисования, но материал изображения увеличит размер установочного пакета приложения. И чем больше размер картинки, тем выше память. Если вы не проектируете ПЗУ, а создаете приложение, я предлагаю вам использовать PS для рисования на холсте 720 × 1280. Этот размер уравновешивает эстетику, экономичность и простоту расчета. Эстетика означает, что приложения, сделанные в этом размере, отлично отображаются в разрешении 720 × 1280 и выглядят более четкими в разрешении 1080 × 1920, а экономичное означает, что изображения, экспортируемые в этом разрешении, имеют умеренный размер и занимают внутреннюю память. Он не будет слишком высоким, размер файла образа будет умеренным, а установочный пакет не будет слишком большим, расчет прост, то есть 1dp = 2px, насколько это хорошо!
Созданное изображение, не забудьте позволить разработчику интерфейса поместить его в папку ресурсов drawable-xhdpi.

6. Разница в ширине и высоте экрана
При рисовании в формате 720 × 1280 необходимо учитывать обратную совместимость с различными экранами. Посредством вычислений мы можем узнать, что ширина экрана 320 × 480 и 480 × 800 равна 320 dp, тогда как ширина экрана 720 × 1280 и 1080 × 1920 составляет 360 dp. Между ними разрыв в 40dp, и это 40dp оказывает большое влияние на дизайн. Как показано ниже, левые и правые поля изображения бабочки с экрана отличаются на экране шириной 320dp и на экране 360dp.

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

Если вы хотите устранить эти различия в пропорциях, вы можете сделать это, добавив файл макета. Обычно файл макета помещается в папку макета. Если вы хотите настроить экран 360dp отдельно, вы можете просто создать файл макета и поместить его в layout-w360dp, если вы хотите настроить конкретное разрешение. , Затем вы можете поместить файл макета в папку с разрешением, например layout-854 × 480.

7, несколько папок ресурсов
Я сделал изображение в разрешении 720 × 1280. Пусть разработчик поместит его в папку ресурсов drawable-xhdpi, чтобы оно могло отображаться правильно. Лично я думаю, что достаточно предоставить только один набор материалов. Вы можете проверить, нормально ли работает приложение на недорогих телефонах. Если оно зависло, вы можете при необходимости предоставить некоторые графические материалы с разрешением mdpi, поскольку изображения в формате xhdpi запускаются на телефонах с разрешением mdpi. Займет больше памяти.
Возьмите значок приложения в качестве примера. Размер значка в xhdpi составляет 96 пикселей. Если вы хотите предоставить значок для mdpi отдельно, то размер значка составляет 48 пикселей и помещается в папку ресурсов drawable-mdpi. Размер изображений в каждой папке ресурсов также соответствует закону ldpi: mdpi: hdpi: xhdpi: xxhdpi = 3: 4: 6: 8: 12.

Что делать, если вы сделали изображение в формате 9.png с материалом с высокой разделительной линией 2px и хотите, чтобы тонкие линии были 2px с различной плотностью без масштабирования Android на основе плотности? Вы можете поместить этот разделенный секущий материал в drawable-nodpi. Изображения в этой папке ресурсов будут отображаться в соответствии с фактическим размером пикселя и не будут масштабироваться Android в зависимости от плотности. То есть тонкая линия в mdpi составляет 2px (2dp), а тонкая линия в xhdpi — 2px (1dp).

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

Читайте также:  Лучшие андроид смартфоны до 8000

Источник

Ресурсы

Основы

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

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

Каждое приложение на Android содержит каталог для ресурсов res и каталог для активов assets. Реальное различие между ресурсами и активами заключается в следующем:

  • информация в каталоге ресурсов будет доступна в приложении через класс R, который автоматически генерируется средой разработки. То есть хранение файлов и данных в ресурсах (в каталоге res) делает их легкодоступными для использования в коде программы;
  • для чтения информации, помещенной в каталог активов assets (необработанный формат файла), необходимо использовать AssetManager для чтения файла как потока байтов.

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

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

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

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

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

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

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

Общая структура каталогов, содержащих ресурсы выглядит следующим образом:

Только в assets может располагаться любой набор подкаталогов разной вложенности. Файлы, находящиеся в любом другом каталоге, размещаются именно на уровне этого каталога и не глубже.

Перечисление основных ресурсов Android

Тип ресурса Размещение Описание
Цвета res/values/имя_файла Идентификатор цвета, указывающий на цветовой код. ID таких ресурсов выражаются в R.java как R.color.*. XML-узел: /resources/color
Строки res/values/имя_файла Строковые ресурсы. В их число также входят строки в формате java и html. ID таких ресурсов выражаются в R.java как R.string.*. XML-узел: resources/string. Можно использовать дополнительное форматирование при помощи стандартных html-тегов , и . Методы, которые будут обрабатывать строковые ресурсы с HTML-форматированием, должны уметь обрабатывать эти теги.
Меню /res/menu/имя_файла Меню в приложении можно задать как XML-ресурсы.
Параметры /res/values/имя_файла Представляет собой параметры или размеры различных элементов. Поддерживает пиксели, дюймы, миллиметры, не зависящие от плотности экрана пиксели (dip) и пиксели, не зависящие от масштаба. ID таких ресурсов выражаются в R.java как R.dimen.*. XML-узел: resources/dimen
Изображения /res/drawable/ваши_файлы Ресурсы-изображения. Поддерживает форматы JPG, GIF, PNG (самый предпочтительный) и др. Каждое изображение является отдельным файлом и получает собственный идентификатор, который формируется по имени файла без расширения. Такие ID ресурсов представлены в файле R.java как R.drawable.*. Система также поддерживает так называемые растягиваемые изображения (stretchable image), в которых можно менять масштаб отдельных элементов, а другие элементы оставлять без изменений.
Отрисовываемые цвета /res/values/ваш_файл или /res/drawable/ваши_файлы Представляет цветные прямоугольники, которые используются в качестве фона основных отрисовываемых объектов, например точечных рисунков. Поддержка такой функции обеспечивается тегом значения drawable, находящимся в подкаталоге значений. Такие id ресурсов выражаются в файле R.java как R.drawable.*. ХМL-узел для такого файла: /resources/drawable. В Android при помощи специальных ХМL-файлов, расположенных в /res/drawable, также подерживаются скругленные и градиентные прямоугольники. Корневым ХМL-тегом для drawable является . Идентификаторы таких ресурсов выражаются в файле R.java как R.drawable.*. В таком случае, каждое имя файла преобразуется в уникальный id отрисовываемого объекта
Анимация /res/anim/ваш_файл Android может выполнить простую анимацию на графике или на серии графических изображений. Анимация включает вращения, постепенное изменение, перемещение и протяжение.
Произвольные XML-файлы /res/xml/*.xml В Android в качестве ресурсов могут использоваться произвольные XML-файлы. Они компилируются в aapt. Идентификаторы таких ресурсов также выражаются в файле R.java как R.xml.*
Произвольные необработанные ресурсы /res/raw/*.* Любые нескомпилированные двоичные или текстовые файлы, например, видео. Каждый файл получает уникальный id ресурса. Идентификаторы таких ресурсов выражаются в файле R.java как R.raw.*
Произвольные необработанные активы /assets/*.*/*.* Можно использовать произвольные файлы в произвольно названных каталогах, которые находятся в подкаталоге /assets. Это не ресурсы, а просто необработанные файлы. В этом каталоге, в отличие от /res, подкаталоги могут располагаться на любой глубине. Для таких файлов не создаются идентификаторы ресурсов. При работе с ними нужно использовать относительное имя пути, начиная с /assets, но не указываея этого каталгоа в имени пути

Идентификаторы

Этот тип ресурсов формируется, как правило, автоматически, и программисты даже не обращают на него внимания. Когда вы размещаете новый элемент на форме, с которым будете взаимодействовать в программе, то ему нужно присвоить идентификатор. Как правило, это происходит в виде @+id/editText (часто это происходит автоматически). Знак плюса обозначает, что если идентификатора не существует, то его нужно создать в классе R. В программе вы можете обращаться к элементу R.id.editText.

Но можно заранее создать ресурс типа item для задания id, не связанного ни с каким конкретным ресурсом:

Здесь type описывает тип ресурса, в данном случае id. Когда id будет установлен, будет работать и следующее определение View:

Обычно идентификаторы размещают в отдельном файле res/values/ids.xml.

Строковые ресурсы

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

При разработке первого приложения вы видели, что система создала файл strings.xml, в котором хранились строки для заголовка приложения и выводимого сообщения. Вы можете редактировать данный файл, добавляя новые строковые ресурсы. А также вы можете создать новые файлы, которые будут содержать строковые ресурсы, например, strings2.xml, catnames.xml и т.д. Все эти файлы должны находиться в подкаталоге /res/values. Запомните, имена файлов и их число не важно. Но в большинстве случаев программисты используют для строковых ресурсов стандартное имя strings.xml. Типичный файл выглядит следующим образом.

При создании или обновлении файла со строковыми ресурсами среда разработки автоматически создаёт или обновляет класс R.java, сообщая уникальные ID для определённых в файле строковых ресурсов (Независимо от количества файлов ресурсов, в проекте содержится только один файл R.java). Если открыть данный файл, то можно найти там наши ресурсы в следующем виде:

В принципе достаточно запомнить, что R.java создаёт внутренний статический класс как пространство имён, в котором содержатся ID строковых ресурсов. Два static final int, которые используются в переменных hello и app_name, являются идентификаторами ресурсов и соответствуют соответствующим строковым ресурсам. Вы можете использовать данные идентификаторы в своем исходном коде, используя следующий формат — R.string.hello.

Обратите внимание, что сгенерированные ID указывают на int, а не на String. Android при необходимости самостоятельно подставляет вместо int нужные строки.

Обычно принято хранить строковые ресурсы в файле strings.xml, но вы можете использовать несколько файлов. Главное, чтобы XML-файл имел необходимую структуру и находился в подкаталоге res/values.

Структура файла для строковых ресурсов довольно проста. Имеется корневой узел , за которым следуют один или несколько дочерних элементов . Каждый элемент в свою очередь имеет свойство name, которое в файле R.java представляет собой атрибут id.

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

Запомните, что пробелы в начале и в конце строк обрезаются. Если вам так нужны пробелы, то разместите строку в кавычках и строка будет выводиться как есть. Также можно попробовать использовать код \u0020 вместо пробела.

Такая же проблема и с несколькими пробелами внутри строки — будет выводиться только один пробел (напоминает поведение в html-документе).

Продвинутые приёмы работы со строковыми ресурсами

Кроме стандартного использования строковых ресурсов, можно использовать более сложные приёмы. Посмотрим, как определять и использовать строки, написанные на HTML, а также узнаем, как происходит подстановка переменных в строковых ресурсах.

Начнём с того, как определять в ХМL-файлах ресурсов следующие виды строк:

  • обычные строки
  • строки в кавычках
  • НТМL-строки
  • заменяемые строки

Этот ХМL-файл строковых ресурсов должен находиться в подкаталоге res/values. Имя файла выбирается произвольно.

Обратите внимание — строки, находящиеся в кавычках, необходимо либо пропускать, либо помещать в дополнительные кавычки. При определении строк также можно использовать стандартные последовательности Jаvа, предназначенные для форматирования строк.

Нельзя использовать символы ‘&amp’, ‘ вы определяете элемент bool с нужным значением. У элемента есть атрибут name — строка, определяющая имя булевого ресурса.

Получить значение через код:

В макете для булевых атрибутов

Числовые ресурсы

В ресурсах можно хранить числа типа Integer. Хранить можно в произвольном имени XML-файла в папке res/values/ в корневом элементе

У элемента есть атрибут name, определяющий имя числового значения.

Для работы в коде:

Таким образом, для работы с типами boolean и int следует применять код (в общем виде):

Нет необходимости писать избыточный код (хотя он и будет работать) типа такого:

Ресурсы меню

Не создавайте меню в коде приложения, а используйте отдельные ресурсы для меню в формате XML. Можно использовать как для описания обычного и контекстного меню. Меню, описанное в формате XML, загружается в виде программного объекта с помощью метода inflate, принадлежащего сервису MenuInflater. Как правило, это происходит внутри обработчика onCreateOptionsMenu (смотри урок Меню).

Описание меню хранится в отдельном файле в каталоге res/menu. Имена файлов без расширения автоматически становятся идентификаторами ресурсов.

В ХМL-файле меню есть три элемента:

  • — корневой элемент файла меню;
  • — контейнерный элемент, определяющий группу меню;
  • — элемент, определяющий пункт меню

Элементы и могут быть дочерними элементами .

Элемент item может иметь несколько атрибутов:

id Идентификатор пункта меню, по которому приложение может распознать при выделении пункта меню пользователем title Текст, который будет выводиться в меню icon Значок для пункта меню. Можно использовать графический ресурс

Ресурсы разметки

Еще один из важных видов ресурсов — ресурсы разметки, которые отвечают за внешний вид приложения. Данные ресурсы представлены в формате XML. Ресурс разметки формы (layout resource) — это ключевой тип ресурсов, применяемый при программировании пользовательских интерфейсов в Android. Каждый ресурс, описывающий разметку, хранится в отдельном файле каталога res/layout. Имя файла без расширения выступает как идентификатор ресурса.

Ниже представлен фрагмент исходного кода для разметки:

Строка setContentView(R.layout.main); указывает на то, что у нас имеется статический класс, называемый R.layout, в котором есть константа main (некое число), указывающая на View, определяемый в ХМL-файле ресурса разметки формы. ХМL-файл будет иметь имя main.xml, и он должен быть размещен в подкаталоге ресурсов res/layout и содержать необходимое определение разметки формы.

Содержимое самого файла main.xml может быть таким:

В данном файле разметки формы имеется корневой узел
, в котором содержится дочерний элемент

Для каждого варианта разметки требуется специальный файл. Если вы рисуете два экрана, вам понадобится два файла разметки, например, res/layout/screenl_layout.xml и res/layout/screen2_layout.xml. Каждый файл в подкаталоге res/layout генерирует уникальную константу на основе имени файла (без расширения). При работе с ресурсами разметки здесь важно количество файлов, а при работе со строковыми ресурсами важно количество отдельных строковых ресурсов внутри файлов. Например, если в подкаталоге res/layout у нас есть два файла filel.xml и filе2.xml, то в файле R.java будут содержаться следующие записи:

Элементы управления, которые используются в данных файла компоновки, например, TextView, будут доступны в коде через ID, генерируемым в R.java:

В данном примере мы находим класс TextView при помощи метода findViewByid() класса Activity. Константа R.id.textView соответствует ID, заданному в TextView. Идентификатор для TextView в файле разметки выглядит следующим образом:

Значение атрибута id указывает, что константа textView будет использоваться для идентификации этого вида среди других, используемых данным окном. Знак + в @+id/textView означает, что будет создан ID с именем textView, если он еще не существует.

Синтаксис ссылок на ресурсы

Все ресурсы Android идентифицируются по их id, содержащемуся в исходном коде Jаvа. Синтаксис, используемый при связывания id с ресурсом в файле XML, называется синтаксис ссылок на ресурс (resource-reference syntax). Синтаксис атрибута id в предыдущем примере @+id/textl имеет следующую структуру:

Параметр tуре соответствует одному из пространств имен:

Параметр name — это имя ресурса. Оно также представлено в виде константы int в файле R.java.

Если не указывать пакет (package), то разрешение пары type/name будет производиться на основе локальных ресурсов и локального пакета R.java. Если указать android:type/name, то связывание ID ссылки будет производиться с применением пакета Android, в частности с использованием файла android.R.java. Вы можете использовать имя любого java-пакета вместо подстановочного слова package, чтобы использовать файл R.java, подходящий для связывания ссылки.

Рассмотрим несколько примеров

TextView android:id=»text» — Ошибка компиляции, так как id не принимает необработанные текстовые строки.

TextView android:id=»@text» — Неправильный синтаксис. Не хватает названия типа. Вы получите сообщение об ошибке «No Resource type specified»

TextView android:id=»@id/text — Ошибка: не найдено ни одного ресурса, соответствующего id «text». Возможно, вы не задали «text» как один из видов ID

TextView android:id=»@android:id/text» — Ошибка: Ресурс не является общедоступным». Означает, что такой id отсутствует в android.R.id. Чтобы такая запись была действительной, необходимо в файле Android.R.java задать id с таким именем

TextView android:id==»@+id/text — Успешно: создает id с названием «text» в файле R.java локального пакета.

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

Общий принцип присвоения id предполагает либо создание нового id для ресурса, либо использование одного из id, созданных в пакете Android. Однако id можно создавать и заранее, а потом использовать их в собственных пакетах.

в предыдущем фрагменте кода указывает, что id с названием text, будет использоваться в том случае, если этот id уже создан. Если id еще не существует, нужно создать новый идентификатор. В связи с этим возникает вопрос: может ли id, например, text уже существовать в файле R.java, чтобы такой идентификатор можно было использовать многократно?

Можно предположить, что такую задачу могла бы выполнять константа, например R.id.text, находящаяся в файле R.java, но R.java не поддается редактированию. Даже, если бы было возможно внести такие изменения, файл приходилось бы заново генерировать после добавления, изменения или удаления любой информации из подкаталога res/*.

Решение проблемы заключается в использовании тега ресурса под названием item для задания id, не связанного ни с каким конкретным ресурсом. Ниже приведен соответствующий пример:

Здесь type описывает тип ресурса, в данном случае id. Когда id будет установлен, будет работать и следующее определение View:

Цветовые ресурсы

Для работы со цветом используется тег , а цвет указывается в специальных значениях.

Также существуют предопределенные названия цветов. Такие ID доступны в пространстве имен android.R.соlor. Посмотреть цветовые значения цветов можно в документации http://developer.android.com/reference/android/R.color.html.

Например, там есть оранжевый цвет holo_orange_dark, а также оранжевый-светлый, синий-темный, синий-светлый и т.д.

Обычно для цветовых ресурсов используют файл colors.xml в подкаталоге res/values. Но можно использовать любое произвольное имя файла, или даже вставить их в файл вместе со строковыми ресурсами strings.xml. Android прочтет все файлы, а затем обработает их, присвоив им нужные ID.

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

Более длинный вариант без склейки методов.

При использовании в xml-файлах (например, файл разметки) используется следующий формат:

Обратите внимание на использование префикса @ для того, чтобы ввести ссылку ресурса — текст после этого префикса — имя ресурса. В этом случае мы не должны были указывать пакет, потому что мы ссылаемся на ресурс в нашем собственном пакете. Для ссылки на системный ресурс мы должны записать: android:textColor=»@android:color/black» (чёрный цвет).

Ресурсы размеров

В Android используются следующие единицы измерения: пиксели, дюймы, точки. Все они могут входит в состав ХМL-шаблонов и кода Jаvа. Данные единицы измерения также можно использовать в качестве ресурсов при помощи тега (обычно используют файл dimens.xml):

Список разрешённых единиц измерения можно прочитать в отдельной статье Единицы измерения

Вы должны иметь доступ к каждому экземпляру объекта Resources, чтобы найти значения его параметров. Это можно сделать, применив метод getResources() к объекту Activity. Когда у вас будет объект Resources, его можно запросить по id, чтобы узнать значение этого параметра.

В XML-файлах используется следующий синтаксис

Ресурсы визуальных стилей и тем

Ресурсы со стилями позволяют поддерживать единство внешнего вида приложения. Чаше всего визуальные стили и темы используются для хранения цветовых значений и шрифтов. Обычно используют файл styles.xml.

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

Чтобы создать стиль, используйте тег

Тег поддерживает наследование с помощью атрибута parent, поэтому вы можете свободно варьировать стили.

Чтобы задать ссылку на ресурс, который нужно применить, вместо символа @ укажите префикс ?. Например, укажем цвет, используя стиль темы:

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

Вы могли встречать подобный синтаксис при работе с текстовыми метками или индикаторами прогресса.

res/drawable

В папке res/drawable могут содержаться ресурсы изображений, фигур, градиентов.

Ресурсы отрисовываемых цветов

Кроме обычных изображений в Android поддерживается и другой тип отрисовываемых ресурсов, которые называются отрисовываемыми цветами (color-drawable). По сути, это просто цветные прямоугольники.

Чтобы задать цветной прямоугольник, нужно указать тег в имени узла XML-файла, находящегося в подкаталоге res/values/.

В XML-шаблонах ресурсы используются следующим образом

Mipmap

С появлением Nexus 6 и Nexus 9, Гугл добавила в Android новые типы ресурсов — Mipmap. По сути, это замена ресурсам Drawable для значков приложения. Нужно подготовить значки и расположить их в папках mipmap-mdpi, mipmap-hdpi и т.д. Основная идея заключается в том, что при компиляции неиспользуемые drawable-ресурсы могут быть удалены в целях оптимизации. Перенос значков приложения в новые папки с разными разрешениями позволяет избежать потенциальной проблемы с удалением нужных файлов.

Ресурсы анимации

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

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

Анимацию можно задать в виде изменений параметров alpha (затемнение), scale (масштабирование), translate (перемещение) или rotate (вращение).

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

  • duration — продолжительность анимации в секундах
  • startOffset — миллисекундная задержка перед началом анимации
  • fillBefore — при значении true преобразование происходит перед началом анимации
  • fillAfter — при значении true преобразование происходит после завершения анимации
  • interpolator — описывает изменения в скорости эффекта

Если не использовать атрибут startOffset, все анимационные эффекты внутри набора происходят одновременно.

Пошаговая анимация подразумевает создание последовательности объектов Drawable, каждый из которых будет отображаться в качестве фона на протяжении указанного промежутка времени. Пошаговая анимация хранится в виде ресурсов Drawable в каталоге res/drawable (см. выше). Имена файлов без расширения используются в качестве идентификаторов.

Ресурсы массивов

Существует еще один тип ресурсов для хранения значений массивов. Принято хранить данные ресурсы в файле arrays.xml папки res/values. Вот как может выглядеть файл:

Как видите, есть типы ресурсов array, string-array, integer-array.

Программно получить доступ к ресурсам массива можно так:

Ещё один вариант, который может вам встретиться. Цвета заданы в массиве и доступ к ним через особый объект TypedArray

Скомпилированные и нескомпилированные ресурсы Android

Большинство ресурсов компилируются в двоичные файлы, но некоторые используются без дополнительной обработки. В Android поддержка ресурсов осуществляется преимущественно при помощи файлов двух типов — XML и RAW-файлов (к последним относятся изображения, аудио и видео). При работе с ХМL-файлами мы видели, что в большинстве случаев ресурсы определяются как значения внутри файла XML (это касается, например, строк), а иногда весь ХМL-файл является ресурсом (например, файл ресурса разметки).

Файлы, созданные в XML, также подразделяются на два типа: первые компилируются в двоичный формат, а вторые копируются на устройство без изменений. Например, XML-файлы строковых ресурсов и ресурсов разметки компилируются в двоичный формат. Эти ХМL-файлы имеют заданный формат, в котором узлы XML преобразуются в ID.

XML-документы

Вы также можете специально выбрать некоторые ХМL-файлы и задать для них структуру формата, отличающуюся от принятой по умолчанию, — чтобы эти файлы не интерпретировались и для них не генерировались идентификаторы ресурсов. Однако в данном случае нам как раз нужно, чтобы они компилировались в двоичный формат и чтобы их было удобно локализовывать. Для достижения этой цели файлы XML можно поместить в подкаталог /res/xml — тогда они будут скомпилированы в двоичный формат. В таком случае вы можете воспользоваться поставляемыми вместе с Android инструментами для считывания XML, которые могут считывать ХМL-узлы.

Ниже приведен пример ХМL-файла в подкаталоге res/xml/test.xml:

Как и при работе с другими ХМL-файлами ресурсов, ААРТ компилирует такой ХМL-файл, перед тем как поместить его в пакет прикладных программ. Для синтаксического разбора подобных файлов используйте экземпляр XmlPullParser:

Возвращённый XmlResourceParser является экземпляром XmlPullParser, а также реализует java.util.AttributeSet.

Пример работы с XML-документами описан в статье Работаем с XML-документами

Использование необработанных ресурсов RAW

Если разместить файлы, в том числе написанные на XML, в каталоге res/raw, они не будут скомпилированы в двоичном формате, а попадают в пакет прикладных программ как есть. Для считывания таких фалов нужно использовать явные API с поддержкой потоков. К категории raw относятся аудио- и видеофайлы.

Каждый такой файл, помещённый в папку res/raw, имеет свой идентификатор, генерируемый в R.java. Чтобы получить доступ к ресурсам, предназначенным только для чтения, вызовите метод openRawResource(), принадлежащий объекту Resource приложения. Таким образом, вы получите объект InputStream, основанный на указанном файле. В качестве имени переменной, принадлежащей R.raw, задайте имя файла (без расширения). Если бы вы поместили текстовый файл в res/raw/test.txt, то его можно было бы прочитать при помощи следующего кода, используя идентификатор test:

Мы уже рассматривали структуру папок в каталоге res. Компилятор ресурсов, входящий в состав инструмента Android Asset Packaging Tool (ААРТ), собирает все ресурсы, кроме raw, и помещает все их в итоговый файл АРК. Этот файл, содержащий код и ресурсы приложения Android, аналогичен файлу JAR, который применяется в Java (АРК означает Android package — пакет Android). Именно файл АРК устанавливается на устройство.

Использование ресурсов в коде программы

Подведём воедино информацию об использовании ресурсов в коде программы.

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

  • R.anim — идентификаторы для файлов из каталога res/anim/ (анимация);
  • R.array — идентификаторы для файлов из каталога res/values/ (массивы);
  • R.bool — идентификаторы для битовых массивов в файлах arrays.xml из каталога res/values/;
  • R.integer — идентификаторы для целочисленных массивов в файлах arrays.xml из каталога res/values/;
  • R.color — идентификаторы для файлов colors.xml из каталога res/values/ (цвета);
  • R.dimen — идентификаторы для файлов dimens.xml из каталога res/values/ (размеры);
  • R.drawable — идентификаторы для файлов из каталога res/drawable/ (изображения);
  • R.id — идентификаторы представлений и групп представлений для файлов ХМL-разметки из каталога res/layout/;
  • R.layout — идентификаторы для файлов разметки из каталога res/layout/;
  • R.raw — идентификаторы для файлов из каталога res/raw/;
  • R.string — идентификаторы для файлов strings.xml из каталога res/values/ (строки);
  • R.style — идентификаторы для файлов styles.xml из каталога res/values/ (стили);
  • R.xml — идентификаторы для файлов из каталога res/xml/.

Синтаксис для обращения к ресурсу:

При использовании системных ресурсов используется класс android.R.

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

Если вам нужен не идентификатор, а сам экземпляр ресурса, то используйте метод getResources для доступа к экземпляру класса Resources:

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

Итак, к графическим ресурсам можно обратиться через R.drawable.cat (файл cat.png), а к музыкальным трекам через R.raw.meow (файл meow.mp3) и по аналогии с другими типами ресурсов.

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

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

Допустим, у вас файлы имеют схожие имена meow1.mp3, meow2.mp3, meow3.mp3. По приведённой выше схеме не составит труда создать переменную типа String fileName = «meow» + n. Такой подход может пригодиться в циклах, когда счётчик можно сопоставить с именем файла.

Можете заменить имя пакета на программное извлечение с помощью метода Context.getPackageName().

Получить идентификатор ресурса по его имени

Ещё один полезный способ, который может пригодиться. Получить идентификатор по имени файла (без расширения) при помощи метода getIdentifier():

Пример для графического ресурса.

Пример для строкового ресурса в виде функции на Kotlin. Сам идентификатор в виде числа может и не очень нужен, но он поможет узнать имя ресурса.

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

Пример для строкового ресурса на Kotlin

Вложенные ресурсы

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

Полное имя packagename нужно указывать только при использовании сторонних пакетов, при использовании собственных ресурсов данный параметр можно опустить, так как Android предполагает, что вы используете ресурсы пакета со своим приложением.

Использование системных ресурсов

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

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

Чтобы получить доступ к системным ресурсам внутри XML-файла, используйте значение android следующим образом:

Создание ресурсов для локализации и аппаратных конфигураций

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

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

Как видите, мы создали несколько файлов strings.xml, которые содержат текст на французском и русском языках и раскидали их по нужным каталогам. Далее приводится список возможных идентификаторов, которые можно использовать для создания альтернативных значений в ресурсах.

Регионы и язык можно указывать без всякой связи друг с другом. Так в папке values-ru-rJP будут храниться русские тексты для жителей Японии.

  • Мобильный код страны и код мобильного оператора (MCC/MNC) — содержит информацию о стране и опционально о мобильной сети, которая привязана к SIM-карте. MCC (Mobile Country Code) состоит из символов mcc, за которыми следует трехзначный код страны. Также можно добавить MNC (Mobile Network Code), используя символы mnc и двухзначный код мобильной сети, например, mcc250-mnc99 (Россия-Билайн). Список кодов MCC/MNC можно посмотреть в Википедии.
  • Язык и регион — указывает на язык при помощи языкового кода в формате ISO 639-1. Состоит из двух символов в нижнем регистре. В случае необходимости можно добавить обозначение региона в виде символа r и двухсимвольного кода в формате ISO 3166-1-alpha-2, записанного в верхнем регистре, например, en-rUS, en-rGB, fr-rCA.
  • Размер экрана — может иметь одно из следующих значений:
    • small — меньше, чем HVGA, 3.2 дюйма
    • medium — HVGA или меньше, чем HVGA, типичный размер
    • large — VGA или больше, планшет или нетбук
  • Высота и ширина экрана — можно использовать значения
    • long — для экранов, которые в альбомном режиме значительно шире, чем на стандартных смартфонах (таких как G1);
    • notlong — для экранов с обычным соотношением сторон
  • Ориентация экрана — возможны значения port (Портретный), land (Альбомный), square (Квадратные экраны).
  • Плотность пикселов на экране — возможны значения:
    • ldpi — предназначен для хранения ресурсов, рассчитанных на экраны с низкой плотностью пикселей (100–140 dpi);
    • mdpi — для экранов со средней плотностью пикселей (140–180 dpi);
    • hdpi — для экранов с высокой плотностью пикселей (190–250 dpi);
    • xdpi — новый тип для очень высокой плотности для планшетов
    • nodpi — Вы можете использовать значение nodpi для растровых ресурсов, которые не должны масштабироваться. В этом случае система не требует точного совпадения.

    Подбирая подходящий каталог, Android выберет тот спецификатор, который наиболее точно описывает плотность пикселей экрана устройства и откорректирует масштаб объекта Drawable. По умолчанию, в новом проекте создаются папки drawable-ldpi, drawable-mdpi, drawable-hdpi, drawable-xhdpi, в которых содержатся значки для приложения.

  • Тип сенсорного экрана — возможны варианты: notouch, stylus, finger.
  • Наличие клавиатуры — возможны варианты: keysexposed, keyshidden, keysoft.
  • Тип ввода — возможны варианты: nokeys, qwerty, 12key.
  • Способ навигации — возможны варианты: nonav, dpad, trackball, wheel.

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

Корректные варианты

Некорректные варианты

Пример с локализацией программы можно посмотреть в статье Локализация приложений.

Псевдонимы (alias)

Чтобы избежать дублирования ресурсов, можно использовать псевдонимы, которые будут ссылаться на один и тот же ресурс. Предположим вы создали два файла res/layout-land/activity_main.xml и res/layout-large/activity_main.xml с одинаковым содержанием для разметки с альбомной ориентацией для смартфонов и планшетов. Создайте теперь ещё один файл с таким же содержанием, например под именем res/layout/activity_main_horizontal.xml. Теперь два одинаковых файла можете удалить. Вместо них создайте два файла res/values-land/refs.xml и res/values-large/refs.xml.

Такой приём часто применяется при использовании фрагментов.

Получение идентификаторов ресурсов приложения

Врядли вам пригодится этот код в жизни. Для общего развития.

Источник

Читайте также:  Красивейшие виджеты для андроид
Оцените статью