Графический интерфейс пользователя
В Android-приложениях графический интерфейс пользователя (UI) базируется на объектах View и ViewGroup. Класс View является базовым классом для ViewGroup.
Объекты View являются основными компонентами для создания пользовательского интерфейса. Класс View содержит ряд подклассов, называемых виджетами, которые знакомы нам как текстовые поля, кнопки, списки и т. д.
Класс ViewGroup содержит подклассы, называемые разметками (layouts), которые отвечают за расположение элементов пользовательского интерфейса на форме.
Разметка
Разметка определяет структуру расположения элементов в окне. Разметку можно объявлять двумя способами:
- объявить элементы в XML
- создать разметку для окна в коде программы во время выполнения — инициализировать объекты Layout и дочерние объекты View, ViewGroup и управлять их свойствами программно
Android позволяет использовать каждый из этих методов в отдельности или оба сразу для объявления и управления пользовательским интерфейсом в приложении. Можно объявить заданные по умолчанию разметки вашего приложения в XML, включая экранные элементы, а затем добавить код, который во время выполнения изменит состояние объектов на экране.
ADT-плагин включает в себя визуальный редактор разметки Layout Editor. C его помощью можно создавать и просматривать будущий интерфейс программы в наглядном виде.
Чаще всего используется первый способ при помощи XML, который похож на HTML-разметку. Преимущество объявления пользовательского интерфейса в XML-файле состоит в том, что это дает возможность отделить представление приложения от программного кода. Вы можете изменять пользовательский интерфейс в файле разметки без необходимости изменения вашего программного кода.
При помощи XML-разметки можно создавать отдельные интферфейсы для различных ориентаций экрана устройства (портретная, альбомная), размеров экрана и языков интерфейса.
Каждый элемент в XML является объектом View или ViewGroup (или их потомком). Программно создать объекты View и ViewGroups можно при помощи метода addView(view).
Можно структурировать интерфейс приложения многими способами в зависимости от требований к графическому интерфейсу приложения. Каждый из этих способов разметки предлагает уникальный набор параметров, которые используются, чтобы определить позиции дочерних представлений и структуру разметки на экране. Подробнее о типах разметки будет рассказано в следующем уроке.
Объявление в XML
Используя XML-технологию можно быстро проектировать пользовательский интерфейс приложения, как это делается в HTML. При этом каждый файл разметки должен содержать только один корневой элемент, который должен быть объектом View или ViewGroup. Корневой элемент, в свою очередь, может иметь вложенные объекты разметки или виджеты. Чтобы понять применяемую концепцию, достаточно посмотреть на структуру файла в своем примере (смотри урок День второй::Создаем первое приложение).
Каждый объект View и ViewGroup имеет собственный набор XML-атрибутов. Например, Textview поддерживает атрибут textsize, который может отсутствовать у другого элемента. Атрибуты могут также наследоваться любыми объектами View, которые расширяют этот класс. Некоторые атрибуты являются общими ко всем объектам View, потому что они унаследованы от корневого класса View (id, layout_width, layout_height и др.).
Идентификатор
Любой объект View в коде программы можно связать с объектом из файла разметки при помощи идентификатора. Когда приложение откомпилировано, на этот идентификатор ссылаются как на целое число, но при разработке программист создает идентификатор в виде строки для атрибута id. Синтаксис для идентификатора элемента в XML-файле следующий:
android:id="@+id/butHello"
Символ @ в начале строки указывает, что синтаксический анализатор XML должен проанализировать и развернуть остальную часть строки идентификатора и определить это выражение как ресурс идентификатора. Символ + означает, что это новое имя ресурса, которое должно быть создано и добавлено к нашим ресурсам в файл R.java, который среда Android автоматически генерирует для проекта.
В принципе, если в коде мы не будем обращаться к некоторым элементам пользовательского интерфейса, то создавать идентификаторы для них необязательно. Однако при использовании разметки RelativeLayout идентификатор нужен для определения позиции элемента.
Кроме того, идентификаторы должны быть уникальными (на самом деле не совсем уникальными, но лучше не умничать).
Инициализация представлений
При запуске Activity система должна получить ссылку на корневой узел дерева разметки, который будет использоваться для прорисовки графического интерфейса на экране устройства. Для этого в методе onCreate() вызывается метод setContentView(), где в качестве параметра используется ссылка на ресурс разметки в следующем виде:
R.layout.layout_file_name
Например, если XML-разметка находится в файле main.xml, то загрузка происходит так:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...
Прорисовка начинается с корневого узла дерева разметки. Затем последовательно прорисовываются дочерние представления дерева разметки. Это означает, что родители будут прорисовываться раньше, чем их дочерние представления, — т. е. по окончании процесса прорисовки родители будут находиться на заднем плане по отношению к дочерним узлам.

