ViewGroup можно рассматривать как контейнер View элементов (дочерних), в этом контейнере элементы хранятся согласно поведению и структуре, который присущ данной ViewGroup. ViewGroup можно назвать родительским элементом, для View, которые хранятся в нем, а сами View – дочерними для этого ViewGroup.

И так нам интересен layout-файл, он располагается в папке res -> layout.



Открываем его и видим следующее:



Это макет нашего экрана, именно это увидит пользователь когда приложение запустит данный layout-файл. А так как этот слой отобразится первым, то соответственно это первое что увидит пользователь в вашем приложении. Стоит отметить что порядок отображения слоев должно регулироваться исполняемым кодом. То есть именно программист при создании приложения должен определять когда и при каких обстоятельствах отобразится данный слой.

Слева мы видим набор View-элементов укомплектованные в иерархии. Если мы перетащим какой-нибудь элемент на наш слой, то он автоматически добавится в наш layout-файл.

Справа в верхнем углу видим логическую структуру нашего слоя, давайте разберемся с этим подробнее. И так наш layout-файл имеет корневой слой RelativeLaoyt (один из видов слоев), в данном случаем слой является элементом ViewGroup. Стоит понимать разницу между layout-файлом (файлом разметки) и layout (слоем). Первое это наш экран, вторым можно назвать View-элемент, хотя это не совсем так, как было сказано layout (слой) – это элемент ViewGroup. Любой layout-файл имеет свой корневой слой, в этом слое хранятся дочерние элементы, согласно правилам этого слоя. При создании проекта у нас уже добавился автоматически дочерний View – TextView с надписью: «Hello world».

Как вы уже, наверное, в наборе View, расположенной слева, есть иерархия Layouts.



В этой иерархии хранятся все виды слоев. Вы можете перетащить любой из них на ваш корневой layout. В этом случае корневой слой будет считаться родительским, а слой, который мы добавили – дочерний. Дочерний слой будет принимать те правила существования, которые присущи его родительскому слою. В то же время, если мы добавим в созданный слой какой-нибудь элемент (другой слой или просто элемент View), то этот элемент будет уже дочерним и будет принимать правила уже созданного поверх корневого слоя, а не самого корневого слоя. То есть суть в том, что дочерний элемент существует согласно поведению, которое диктует родительский.

Еще хотел бы отметить несколько моментов интерфейса создания layout-файлов.

Во-первых: это окно свойств View-элемента. Для начала выделим элемент, свойства которого мы хотим поменять, и в правом нижним углу появится панель.



Собственно в нем все довольно понятно. Вы можете поменять расположение элемента, его размеры, фон, текст, отступ и другие параметры.

Во-вторых: это текстовый способ заполнения layout-файла. В низу расположена панель:



Легко догадаться, что сейчас мы создаем в Graphical Layout (то есть путем перетаскивания элементов на наш экран). Существует еще один способ, для этого переключим на activity_main. xml (если ваш layout-файл называется по-другому, то будем название вашего файла). Мы видим совершенно, на первый взгляд непонятый код.



Собственно это и есть наш файл, просто в другом, непривычном для нас, представлении. Заполнение выполняется на языке XML. В корне мы видим наш корневой слой и его свойства, далее созданный элемент в этом слое и его свойства, параметры в том и другом способе совпадают.

В этом и заключается декларативный способ создания экрана. Декларативный способ описывает конечный результат, который должна сгенерировать программа. Затем наш слой закрывается и любые элементы, за этими границами будут содержаться в другом слое или элементе ViewGroup. Если создать элемент за рамками корневого слоя, то среда сгенерирует ошибку.