The Complete Guide to Dimensions in Android
Posted: 2/8/2019
Tagged under: android
Figuring out when to use dimensions in Android can be a tricky time. Should all values be a dimension? How about none of them? You could argue that both of these are valid, but I’d like to clear the air with the statement “sometimes you should use dimension values.” But how do you know when?
What are dimensions?
Dimensions for Reusability
The simplest reason to use a dimension value is when you know that value needs to be reused. If you were to change this value in one place, you would want to change it elsewhere — that’s a perfect case for a dimension value. A great example of this involves a grid that I was working with. We put the grid item width and height into a dimension and then leveraged that for the headers as well.
Here we’re setting up 4 dimension values, two for the grid item, and one for the column width and row height. We’ll use the item width and height for the missing values of the column and row to keep our grid uniform. To keep things, simple, we’ll avoid the recylerview and viewholder and simply do a 1×1 grid.
If we look at the design view in Android studio, we should see something like this:
While this isn’t particularly interesting on it’s own, what is neat is that we can update the value of @dimen/grid_item_width and @dimen/grid_item_height to change the size of the grid item, while still maintaining an appropriate looking grid.
That alone seems like a great reason to use dimensions in Android, but it’s certainly not the only reason!
Dimensions for Screen Density
Given how popular ConstraintLayout is, it’s sometimes easy to forget that screen density is even a thing. However, like all resource files, you can build a dimens.xml for different screen densities or other device properties (such as Locale). Perhaps you want different measurements on high density devices or you may even want to remove extra margins on small density devices. The dimens.xml file can be qualified to a screen density to allow customization on different devices.
Let’s take the same example from above and set a goal: We want to remove the padding on the constraint layout on low density screens. On a high density screen, the padding may be appreciated as it helps move our “grid” away from the edge of the screen. However, with low density, we may not have enough screen space to add that padding. We can use dimens.xml to help.
Heads Up!
Alternatively, you can create a new folder in your resource directory called values-ldpi and add a dimens.xml file to that.
Once you’ve done either of these steps, you should see the new file in Android Studio.
Of course, we’ll want to use this property on devices that aren’t low density, so we’ll need to add it to our regular dimens.xml as well.
Finally, we can update our view to use the new dimension value.
If we set our project to use the 2.7″ QVGA Slider (a low density device) you can see that our padding has been removed!
Converting Dimensions to Pixels
The third reason to use dimensions in Android makes it easy to convert dp values or dip values into to pixels. This is somewhat of an odd use-case, but definitely has it’s practicalities. We can take any of our existing dimensions in our dimens.xml file and, in our code, convert a dp or dip value into pixels like so:
Additionally, you can get them as a float, like so:
When Not to Use Dimensions
Likely, dimensions seem to be the correct way to store your dp or dip related values. However, there are some cases where dimensions may not make the most sense. Values that don’t fit any of the three recommendations above, should generally be left out of the dimensions file, as it can make those values more difficult to maintain and change.
If you’d like to learn more about more about Android development, you can find more of my posts on the subject here! Additionally, you can find the documentation for Dimensions here! Thanks for reading!
Appendix C: Everything about sizes and dimensions in Android
Designing Android app you have to be aware of enormous variety of devices. They have different physical sizes (from small phones to large tablets), different screen sizes (diagonal from 3 inches or less to above 5 inches), different screen resolutions (from 320×480 pixels to Full HD – 1920×1080 – or more) and different screen densities – number of pixels per inch (from 120 dpi to 480 dpi). And there is also screen orientation (landscape or portrait) to take into account.
It would take very, very long time to create layout for every device separately and you still couldn’t be sure that you included all combinations. Fortunately, Android creators tried to do it simpler. You don’t have to create unlimited layouts, but it doesn’t mean that there is nothing to worry about.
Available units: Forget inches (in), say goodbye to pixels (px), use density-independent pixels (dp or dip)
Android allows you to measure layout elements even in inches (abbreviation “in”). So you could say that specific TextView or Button would be 3 inch long and 1 inch tall. This would be rather difficult to use as many elements would have to be measured in fractions and still it would be impossible to be very precise. Similar situations is with millimeters (abbreviation “mm”) and points (abbreviation “pt”).
More common approach is to use pixels (abbreviation “px”). But that leads to another problem. If we create an element that is 160 pixels wide it’s length on medium density screen would be 1 inch and on extra high density screen only 0.5 inch even if the screens have the same resolution.
That’s why there is one more unit which hasn’t those problems. It’s called density-independent pixels (abbreviation “dp” or “dip” – both work). If we say that something has 100dp it would have the same real size on every screen. So for all dimensions in Android app use dp only, unless you really have to use some other unit. When you define dimension in dp, Android automatically uses as many pixels as needed on specific screen to achieve expected size.
List of supported units:
dp or dip – density-independent pixels, abstract unit based on physical density of a screen
in – inches (not recommended)
mm – millimeters (not recommended)
pt – points, 1pt equals 1/72 of inch (not recommended)
px – pixels (not recommended)
You have to put unit after the value without space between.
Ресурсы
Основы
На схеме представлена только часть ресурсов. Система постоянно обновляется и добавляются новые типы.
Каждое приложение на Android содержит каталог для ресурсов res и каталог для активов assets. Реальное различие между ресурсами и активами заключается в следующем:
Android умеет динамически выбирать данные из дерева ресурсов, содержащие разные значения для разных конфигураций, языков и регионов. При запуске Android автоматически загрузит нужный ресурс, не требуя ни одной строчки кода.
Ресурсы в Android являются декларативными. В основном ресурсы хранятся в виде XML-файлов в каталоге res с подкаталогами values, drawable-ldpi, drawable-mdpi, drawable-hdpi, layout, но также бывают и другие типы ресурсов.
Для удобства система создает идентификаторы ресурсов и использует их в файле R.java (класс R, который содержит ссылки на все ресурсы проекта), что позволяет ссылаться на ресурсы внутри кода программы. Статический класс R генерируется на основе ваших заданных ресурсов и создается во время компиляции проекта. При создании класс содержит статические подклассы для всех типов ресурсов, для которых был описан хотя бы один экземпляр. Подробнее о классе R рассказано ниже.
Так как файл R генерируется автоматически, то не смысла его редактировать вручную, потому что все изменения будут утеряны при повторной генерации.
В общем виде ресурсы представляют собой файл (например, изображение) или значение (например, заголовок программы), связанные с создаваемым приложением. Удобств использования ресурсов заключается в том, что их можно изменять без повторной компиляции или новой разработки приложения. Имена файлов для ресурсов должны состоять исключительно из букв в нижнем регистре, чисел и символов подчёркивания.
Общая структура каталогов, содержащих ресурсы выглядит следующим образом:
Только в assets может располагаться любой набор подкаталогов разной вложенности. Файлы, находящиеся в любом другом каталоге, размещаются именно на уровне этого каталога и не глубже.
Перечисление основных ресурсов Android
Идентификаторы
Этот тип ресурсов формируется, как правило, автоматически, и программисты даже не обращают на него внимания. Когда вы размещаете новый элемент на форме, с которым будете взаимодействовать в программе, то ему нужно присвоить идентификатор. Как правило, это происходит в виде @+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). Если открыть данный файл, то можно найти там наши ресурсы в следующем виде:
Обратите внимание, что сгенерированные ID указывают на int, а не на String. Android при необходимости самостоятельно подставляет вместо int нужные строки.
Обычно принято хранить строковые ресурсы в файле strings.xml, но вы можете использовать несколько файлов. Главное, чтобы XML-файл имел необходимую структуру и находился в подкаталоге res/values.
Если вы создаёте несколько файлов с ресурсами, то следите за уникальностью создаваемых имён. Не выйдет ничего хорошего, если в двух файлах будет одна и та же переменная app_name.
Запомните, что пробелы в начале и в конце строк обрезаются. Если вам так нужны пробелы, то разместите строку в кавычках и строка будет выводиться как есть. Также можно попробовать использовать код \u0020 вместо пробела.
Продвинутые приёмы работы со строковыми ресурсами
Кроме стандартного использования строковых ресурсов, можно использовать более сложные приёмы. Посмотрим, как определять и использовать строки, написанные на HTML, а также узнаем, как происходит подстановка переменных в строковых ресурсах.
Начнём с того, как определять в ХМL-файлах ресурсов следующие виды строк:
Этот ХМL-файл строковых ресурсов должен находиться в подкаталоге res/values. Имя файла выбирается произвольно.
Получить значение через код:
В макете для булевых атрибутов
Числовые ресурсы
В ресурсах можно хранить числа типа Integer. Хранить можно в произвольном имени XML-файла в папке res/values/ в корневом элементе
У элемента есть атрибут name, определяющий имя числового значения.
Таким образом, для работы с типами boolean и int следует применять код (в общем виде):
Нет необходимости писать избыточный код (хотя он и будет работать) типа такого:
Ресурсы меню
Не создавайте меню в коде приложения, а используйте отдельные ресурсы для меню в формате XML. Можно использовать как для описания обычного и контекстного меню. Меню, описанное в формате XML, загружается в виде программного объекта с помощью метода inflate, принадлежащего сервису MenuInflater. Как правило, это происходит внутри обработчика onCreateOptionsMenu (смотри урок Меню).
Описание меню хранится в отдельном файле в каталоге res/menu. Имена файлов без расширения автоматически становятся идентификаторами ресурсов.
В ХМL-файле меню есть три элемента:
Элемент item может иметь несколько атрибутов:
id Идентификатор пункта меню, по которому приложение может распознать при выделении пункта меню пользователем title Текст, который будет выводиться в меню icon Значок для пункта меню. Можно использовать графический ресурс
Ресурсы разметки
Ниже представлен фрагмент исходного кода для разметки:
Строка 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уре соответствует одному из пространств имен:
Если не указывать пакет (package), то разрешение пары type/name будет производиться на основе локальных ресурсов и локального пакета R.java. Если указать android:type/name, то связывание ID ссылки будет производиться с применением пакета Android, в частности с использованием файла android.R.java. Вы можете использовать имя любого java-пакета вместо подстановочного слова package, чтобы использовать файл 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
Ресурсы анимации
При использовании анимации промежуточных кадров каждый экземпляр анимации хранится в отдельном XML-файле внутри каталога res/anim. Имена файлов без расширения являются идентификаторами для ресурсов.
Анимацию можно задать в виде изменений параметров alpha (затемнение), scale (масштабирование), translate (перемещение) или rotate (вращение).
Вы можете комбинировать различные экземпляры анимации, используя тег set с атрибутами:
Если не использовать атрибут startOffset, все анимационные эффекты внутри набора происходят одновременно.
Пошаговая анимация подразумевает создание последовательности объектов Drawable, каждый из которых будет отображаться в качестве фона на протяжении указанного промежутка времени. Пошаговая анимация хранится в виде ресурсов Drawable в каталоге res/drawable (см. выше). Имена файлов без расширения используются в качестве идентификаторов.
Ресурсы массивов
Существует еще один тип ресурсов для хранения значений массивов. Принято хранить данные ресурсы в файле arrays.xml папки res/values. Вот как может выглядеть файл:
Как видите, есть типы ресурсов array, string-array, integer-array.
Программно получить доступ к ресурсам массива можно так:
Ещё один вариант, который может вам встретиться. Цвета заданы в массиве и доступ к ним через особый объект TypedArray
Скомпилированные и нескомпилированные ресурсы Android
Файлы, созданные в XML, также подразделяются на два типа: первые компилируются в двоичный формат, а вторые копируются на устройство без изменений. Например, XML-файлы строковых ресурсов и ресурсов разметки компилируются в двоичный формат. Эти ХМL-файлы имеют заданный формат, в котором узлы XML преобразуются в ID.
XML-документы
Ниже приведен пример ХМ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:
Использование ресурсов в коде программы
Подведём воедино информацию об использовании ресурсов в коде программы.
Во время компиляции генерируется статический класс R на основе ваших ресурсов и содержит идентификаторы всех ресурсов в программе. Класс R имеет несколько вложенных классов, один для каждого типа ресурса, поддерживаемого системой Android, и для которого в проекте существует файл ресурса. Класс R может содержать следующие вложенные классы:
Синтаксис для обращения к ресурсу:
При использовании системных ресурсов используется класс 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 будут храниться русские тексты для жителей Японии.
Подбирая подходящий каталог, Android выберет тот спецификатор, который наиболее точно описывает плотность пикселей экрана устройства и откорректирует масштаб объекта Drawable. По умолчанию, в новом проекте создаются папки drawable-ldpi, drawable-mdpi, drawable-hdpi, drawable-xhdpi, в которых содержатся значки для приложения.
Вы можете комбинировать указанные спецификаторы, разделяя их дефисами. Поддерживаются любые сочетания, однако они должны идти в том порядке, как указано в списке, т.е. язык всегда указывается раньше ориентации экрана и т.п. В одном спецификаторе может применяться не более одного значения.
Корректные варианты
Некорректные варианты
Пример с локализацией программы можно посмотреть в статье Локализация приложений.
Псевдонимы (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.
Такой приём часто применяется при использовании фрагментов.
Получение идентификаторов ресурсов приложения
Врядли вам пригодится этот код в жизни. Для общего развития.





