Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Какой View является родителем (parent) корневого элемента xml-разметки?

#android #android_layout #view


В книге (в русском переводе) на странице 39 в описании обычной разметки xml утверждается
следующее:


  В корневом элементе LinearLayout атрибуты ширины и высоты равны
  match_parent. Элемент LinearLayout является корневым, но у него все
  равно есть родитель — представление Android для размещения иерархии
  представлений вашего приложения.


В оригинале (Android Programming - The "Big Nerd Ranch" Guide (3 ed.)) этот же абзац:


  For the root LinearLayout, the value of both the height and width
  attributes is match_parent. The LinearLayout is the root element, but
  it still has a parent – the view that Android provides for your app’s
  view hierarchy to live in.


Интересно узнать подробнее о представлении (как я понимаю, это перевод слова "View")
который содержит в себе иерархию View приложения вместе с корневым элементом. Что из
себя представляет этот View? Взаимодействует ли Разработчик как-то с ним?
    


Ответы

Ответ 1



Попробуем чуть чуть разобраться, а то глядеть просто на иерархию Tools-Android-Layout inspector как-то не интересно. Итак: - (рис. 1) Activity — это компонент приложения, который выдает экран, и с которым пользователи могут взаимодействовать для выполнения каких-либо действий, например набрать номер телефона, сделать фото, отправить письмо или просмотреть карту. Каждой операции присваивается окно для прорисовки соответствующего пользовательского интерфейса. Обычно окно отображается во весь экран, однако его размер может быть меньше, и оно может размещаться поверх других окон (отсюда). Имеется абстрактный класс Window. (далее вольный перевод) Абстрактный базовый класс для определения поведения и внешнего вида окна верхнего уровня (top-level). Экземпляр этого класса должен использоваться как представление верхнего уровня, добавленное в оконный менеджер (window manager). Он предоставляет стандартные политики пользовательского интерфейса, такие как фон, область заголовка, обработка ключевых слов по умолчанию и т.д. Единственной существующей реализацией этого абстрактного класса является android.view.PhoneWindow, которую вы должны создать при необходимости Window. Находим android.view.PhoneWindow. public class PhoneWindow extends Window implements MenuBuilder.Callback {... В нем имеются перегруженные методы setContentView, некоторые из которых, как я понимаю, определяют создание DecorView. А именно, через метод installDecor(). ... if (mContentParent == null) { installDecor(); } ... Внутри installDecor() определяется mDecor. Об этой переменной в строке 111 // This is the top-level view of the window, containing the window decor. private DecorView mDecor; Теперь о DecorView. (рис. 2) Воспользуемся Tools > Android > Layout Inspector View Tree: Иерархия view в макете. Screenshot: Скриншот устройства с видимыми границами для каждого view. Properties Table: макетные свойства для выбранного view. На рисунке видно где в иерархии(1) находится DecorView. DecorView - реальный корень иерархии Views Окна (Window). Реализация промежуточных views между DecorView и корневым элементом нашего макета может различаться в зависимости от версии Android. Для сравнения. Вот так выглядит иерархия view в статье от 2009 года.(рис. 3) Вот так в книге 2016 года (стр 53) (рис. 4) DecorView содержит по умолчанию фон Activity, определяемой темой (theme). Часто данный фон перекрывается фоном нашего макета (layout). DecorView рисуется в первую очередь. Фон можно как удалить, так и поменять с использованием темы: Программно: getWindow().setBackgroundDrawable()

Комментариев нет:

Отправить комментарий