На предыдущем занятии мы познакомились с простым приложением и выяснили, что для отображения элементов на экране их необходимо cкомпоновать (добавить компоновщикам), а компоновщики отобразить на экране (добавить объекту приложения app). А можно элементы добавить не компоновщику, а объекту приложения? Нет. Специфика построения интерфейсов мобильных приложений состоит в том, что видимые элементы управления в большинстве случаев имеют относительное, а не абсолютное позиционирование, как это изначально было характерно для десктопной разработки. В мобильной среде размеры экранов и разрешения различны. На одних экранах интерфейс с абсолютным позиционированием будет смотреться хорошо, а на других будет искажен, плохо читаем или частично невидим. Во избежание этого основным способом размещения элементов в мобильной среде является относительное.
Элементы - это независимые объекты, которые ничего не знают о присутствии рядом с ними других элементов и что-то должно их сгруппировать, упорядочить и выровнить так, чтобы интерфейс смотрелся хорошо на экранах разных мобильных устройств. Для этого и предназначены компоновщики. Элементы могут быть добавлены только компоновщикам, а компоновщики могут добавляться как другим компоновщикам, так и объекту приложения.
Компоновщики используются для отображения объектов, которые имеют визуальное представление. Например, кнопка имеет визуальное представление, а архиватор - нет. Для простоты видимые объекты называют элементами, представлениями, видимостями, виджетами.
Порядок создания объектов не важен, в отличие от порядка их компоновки. Объекты, которые добавляются компоновщику или объекту приложения позже будут перекрывать объекты, добавленные ранее. Порядком отображения объектов можно управлять, указав в методе AddChild второй параметр - порядковый номер, например:
lay.AddChild( txt, 2 );
Можно вывести элемент компоновщика на передний план при помощи метода компоновщика ChildToFront:
lay.ChildToFront( txt );
Элементы можно не только добавлять компоновщикам, но и удалять из них при помощи метода компоновщика RemoveChild, в результате чего элемент перестаёт отображаться:
lay.RemoveChild( txt );
Это действие используется для смены компоновщика: если элемент уже принадлежит одному компоновщику, то при добавлении его другому компоновщику нечего не произойдёт, а в окне отладки появится предупреждение.