Например Когда мы пишем кодЧто происходит за кулисами, когда xml «завышен»?
View view = inflater.inflate(R.layout.main_activity, null);
Что делает Android системы делать?
Например Когда мы пишем кодЧто происходит за кулисами, когда xml «завышен»?
View view = inflater.inflate(R.layout.main_activity, null);
Что делает Android системы делать?
Заканчивать источник для LayoutInflater
. Это абстрактный класс, конкретный пример которого получен через getLayoutInflater()
.
В сущности, надуватель создает объект вида корневого представления (группа корневого представления раздутого XML), затем выполняет два прохода через дерево XML для присоединения каждого дочернего представления. Это делается рекурсивно для обработки «include» и для исправления ссылок между дочерними представлениями, например, в RelativeLayout
и выполняется сверху вниз.
Первый проход строит дерево, создавая экземпляр каждого из дочерних представлений, сверху вниз рекурсивно и передает атрибуты XML конструктору вида, отображая представление о том, насколько большой он должен быть. Затем он вызывает measure()
для каждого дочернего элемента, проходящего в ограничениях, определяемых родителем (например, RelativeLayout с 2 дочерними представлениями, каждый из которых запрашивает match_parent) с использованием объекта спецификаций мер и запрашивает представление о том, насколько он хочет быть. Если сам вид представляет собой группу представлений, он будет использовать тот же алгоритм для измерения своих детей.
Второй проход - это пропуск макета, когда layout()
вызывается для каждого ребенка, чтобы позиционировать себя в пределах представления. Родитель позиционирует представление, используя измерения, рассчитанные в проходе меры. onDraw()
вызывается и передается холст, созданный из растрового рисунка DecorView
.
Окончательное дерево затем готово перейти к оконному менеджеру, который выполняется setContentView()
или addContentView()
.
Саймон, я понимаю, что 'LayoutInflater' только создает объекты' View' из файла 'xml' и добавляет дочерние представления к родительскому. Мера, макет и ничьи не являются обязанностью «LayoutInflater». Не могли бы вы исправить меня, если я ошибаюсь? – Sabeeh
Надувание XML-макета простым языком означает, что вы преобразовываете XML
в View
. Затем вы можете получить каждое представление, объявленное в XML, с использованием родительского/раздутого представления.
Для например -
View view = inflater.inflate(R.layout.main_activity, null);
Теперь здесь view
является ссылкой на XML, из которого можно извлечь все взгляды,
TextView tv = (TextView)view.findViewById(R.id.tv);
Вопрос в том, что делает 'inflater.inflate()' делает? –
Ну, вот что я пытался объяснить. Он дает вам представление, которое является ссылкой на ваш XML. –
Отредактированный вопрос. –
Немного комментарий линия поможет мне понять downvotes. –
Вы спрашиваете, где это происходит в AOSP, или как работает процесс? Если процесс работает, какие конкретные штуки? Как измеряется макет? Как создаются объекты вида? Что-то другое? – Simon
Основной вопрос заключается в том, как это делается, и вторичный вопрос - любые ссылки на код или ссылки будут полезны для понимания процесса. –