2012-12-24 2 views
1

Например Когда мы пишем кодЧто происходит за кулисами, когда xml «завышен»?

View view = inflater.inflate(R.layout.main_activity, null);

Что делает Android системы делать?

+0

Немного комментарий линия поможет мне понять downvotes. –

+0

Вы спрашиваете, где это происходит в AOSP, или как работает процесс? Если процесс работает, какие конкретные штуки? Как измеряется макет? Как создаются объекты вида? Что-то другое? – Simon

+0

Основной вопрос заключается в том, как это делается, и вторичный вопрос - любые ссылки на код или ссылки будут полезны для понимания процесса. –

ответ

4

Заканчивать источник для LayoutInflater. Это абстрактный класс, конкретный пример которого получен через getLayoutInflater().

В сущности, надуватель создает объект вида корневого представления (группа корневого представления раздутого XML), затем выполняет два прохода через дерево XML для присоединения каждого дочернего представления. Это делается рекурсивно для обработки «include» и для исправления ссылок между дочерними представлениями, например, в RelativeLayout и выполняется сверху вниз.

Первый проход строит дерево, создавая экземпляр каждого из дочерних представлений, сверху вниз рекурсивно и передает атрибуты XML конструктору вида, отображая представление о том, насколько большой он должен быть. Затем он вызывает measure() для каждого дочернего элемента, проходящего в ограничениях, определяемых родителем (например, RelativeLayout с 2 дочерними представлениями, каждый из которых запрашивает match_parent) с использованием объекта спецификаций мер и запрашивает представление о том, насколько он хочет быть. Если сам вид представляет собой группу представлений, он будет использовать тот же алгоритм для измерения своих детей.

Второй проход - это пропуск макета, когда layout() вызывается для каждого ребенка, чтобы позиционировать себя в пределах представления. Родитель позиционирует представление, используя измерения, рассчитанные в проходе меры. onDraw() вызывается и передается холст, созданный из растрового рисунка DecorView.

Окончательное дерево затем готово перейти к оконному менеджеру, который выполняется setContentView() или addContentView().

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/view/LayoutInflater.java#LayoutInflater

+0

Саймон, я понимаю, что 'LayoutInflater' только создает объекты' View' из файла 'xml' и добавляет дочерние представления к родительскому. Мера, макет и ничьи не являются обязанностью «LayoutInflater». Не могли бы вы исправить меня, если я ошибаюсь? – Sabeeh

0

Надувание XML-макета простым языком означает, что вы преобразовываете XML в View. Затем вы можете получить каждое представление, объявленное в XML, с использованием родительского/раздутого представления.

Для например -

View view = inflater.inflate(R.layout.main_activity, null); 

Теперь здесь view является ссылкой на XML, из которого можно извлечь все взгляды,

TextView tv = (TextView)view.findViewById(R.id.tv); 
+1

Вопрос в том, что делает 'inflater.inflate()' делает? –

+0

Ну, вот что я пытался объяснить. Он дает вам представление, которое является ссылкой на ваш XML. –

+0

Отредактированный вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^