Все ресурсы приложения для Android хранятся в директории res/<Тип_ресурса>, например res/drawable (для изображений), res/values (для строк), res/layout (для разметки). Эти каталоги соответствуют ресурсам по умолчанию, если же мы хотим задать отдельные ресурсы, для например больших экранов, то необходимо создать еще одну директорию, добавив к ее названию один или несколько спецификаторов.
Например у нас есть директория с двумя файлами
res/drawable/image1.png
res/drawable/image2.png
для больших экранов необходимо создать еще одну директорию
res/drawable-large/image1.png
res/drawable-large/image2.png
Важно, чтобы имена файлов во всех папках с любыми спецификаторами были одинаковыми. Таким образом идентификатор ресурса который мы будем использовать в программном коде не меняется R.drawable.image1 и R.drawable.image2 соответственно. Собственно для программиста нет никакой разницы на каком устройстве будет запускаться программа, система Android при выполнении программы сама определит нужный ресурс и будет использовать именно его.
Возможные спецификаторы
- Язык и регион. Например 'en', 'ru', 'fr', 'en-rUS' и т. д. В последнем случае 'en'- язык, а 'rUS' - регион. Задать отдельно регион без языка нельзя. Язык и регион можно изменить в настройках устройства.
- Минимальная ширина. sw<n>dp, (например 'sw320dp', 'sw720dp'. Минимальная ширина не зависит от ориентации экрана, это по сути минимально возможное значение для меньшей стороны экрана. Так файлы из директории res/layout-sw600dp/ будет использоваться, когда и длина и ширина экрана больше 600dp. Это свойство является характеристикой экрана и не может изменяться в настройках устройства. Если для приложения определено несколько каталогов с этим спецификатором, то система выбирает наиболее близкий (без превышения).
- Доступная ширина. w<n>dp (например 'w720dp', 'w1024dp'). Определяет минимальную доступную ширину экрана. От предыдущего спецификатора этот отличается тем, что зависит от ориентации экрана. Причем учитывается только доступная ширина, поэтому если часть экрана занята какими-то статическими элементами (например меню телефона), то используется значение меньше реальной ширины на ширину этих элементов. Также как у предыдущего если определено несколько каталогов с этим спецификатором, то система выбирает наиболее близкий (опять же без превышения).
- Доступная высота. h<n>dp. Определяет минимальную доступную высоту экрана. Свойства спецификатора аналогичны предыдущему.
- Размер экрана. Например 'small' (размер экрана около 320х426dp, это QVGA низкой плотности и VGA высокой плотности); 'normal' (320x470dp, WQVGA низкой плотности, HVGA средней плотности и WVGA высокой плотности); 'large' (480x640dp VGA и WVGA средней плотности); 'xlarge' (720x960dp). Указанные размеры не обязательно должны точно совпадать с реальными размерами устройства, система будет использовать наиболее близкий и подходящий.
- Ориентация экрана. 'port' - портретная ориентация; 'land' - альбомная
- Плотность пискселей на экране (dpi). Например 'ldpi' (низкая плотность, около 120dpi); 'mdpi' (160dpi); 'hdpi' (240dpi); 'xhdpi' (320dpi); 'nodpi' (для изображений, которые не должны изменяться)
- Тач-скрин. 'notouch' (нет тач-скрина); 'stylus' (тач-скрин, который подходит для использования стилуса); 'finger' (тачскрин, который подходит для использования пальцем)
- Способ ввода. 'nokeys' у устройства нет клавиатуры; 'qwerty' есть qwerty-клавиатура
- Способы навигации кроме тач-скрина. Например 'nonav' не имеется; 'dpad' - джойстик; 'trackball' - трекбол;
- Версия платформы (API level). Например 'v3', 'v4', 'v7'
При использовании спецификаторов необходимо помнить:
- Можно использовать несколько спецификаторов в названии одной директории. Например drawable-ru-land-trackball. Причем спецификаторы должны быть в порядке котором они указаны в таблице
- Директории ресурсов со спецификаторами (как впрочем и без них) не могут быть вложенными.
- Значение спецификатора не зависят от регистра, во время компиляции все они приводятся к нижнему регистру.
- В название одной директории может использоваться только один спецификатор каждого типа. Поэтому название drawable-ru-en некорректно, в случае если ресурсы для русского и английских языков совпадают необходимо все равно создавать две директории.
Возьмем для примера программу из предыдущей статьи. При повороте телефона, картинка автоматически поворачивается.
Теперь сделаем, чтобы при повороте экрана внешний вид немного менялся, скажем, перенесем дату вправо. Для этого надо создать новый xml-файл разметки. До этого все xml-файлы мы клали в директорию res/layout. Создадим директорию res/layout-land откуда будут браться файлы разметки для горизонтальной ориентации экрана. Можно создать отдельную директорию res/layout-port для вертикальной ориентации, но в данном случае этими файлами являются файлы из res/layout, поэтому особо смысла в этом нет.
Для того чтобы изменить внешний вид списка достаточно изменить один файл item.xml, в котором содержится разметка одной строки списка. Скопируем файл в res/layout-land и немного изменим
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:padding="5px"
- >
- <ImageView
- android:id="@+id/Image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- <TextView
- android:id="@+id/Sign"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="20sp"
- android:textStyle="bold"
- android:textColor="#FF0000"
- android:layout_weight="1.0"
- />
- <TextView
- android:id="@+id/Date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="14sp"
- android:textStyle="italic"
- />
- </LinearLayout>
Теперь все три элемента располагаются в строку, также мы добавили в TextView (id="@+id/Sign") атрибут android:layout_weight="1.0". Этот атрибут добавляет «вес» элементу в контейнере (layout). Элемент, имеющий «вес» равный 1.0 занимает все свободное пространство в контейнере. Таким образом название знака зодиака займет все свободной пространство, а дата прижмется к правой границе. Все, никаких изменений в коде не потребуется. Запускаем.
Теперь при повороте телефона список изменяет внешний вид.
Если же в приложении поворот экрана нежелателен, можно использовать метод
void setRequestedOrientation(int requestedOrientation)
который задает ориентацию экрана вне зависимости от положения телефона.
Добавим этот метод в onCreate
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- ...
- }
Возможные значения переменной requestedOrientation, можно посмотреть тут
Запускаем. Теперь как не крути телефон, список не меняется.
UPD
Создание ссылок на ресурсыКак было сказано выше, в название одной директории может использоваться только один спецификатор каждого типа. Поэтому название drawable-ru-en некорректно, в случае если ресурсы для русского и английских языков совпадают необходимо создавать две директории. Но это не значит, что придется хранить две копии одного файла.
Например, нам нужно изображение image.png одинаковое для русского и английского языка. Переименуем его и положим в res/drawable/image_ru_en.png. А в двух директориях res/drawable-ru и res/drawable-en создадим файл image.xml, который ссылается на это изображение.
- <?xml version="1.0" encoding="utf-8"?>
- <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/icon_ru_en" />
Можно делать ссылки на файлы разметки, используя теги <merge> и <include>
- <?xml version="1.0" encoding="utf-8"?>
- <merge>
- <include layout="@layout/main_ru_en"/>
- </merge>
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="string">My String</string>
- <string name="alias">@string/string</string>
- </resources>
Комментариев нет:
Отправить комментарий