Почему параметры макета работают в программировании Android? - PullRequest
7 голосов
/ 08 ноября 2011

Прежде всего мой опыт: я новичок в Java, пришедший из Ruby. Если это поможет.

Я не понимаю, как работают параметры макета. Я следую основному введению Hello World при создании приложения для Android. Шаг 1, расширьте класс Activity и метод onCreate () для доступа к макету XML. Хорошо, я понял.

Затем я создаю макет (скажем, RelativeLayout) в Main.XML. Так что здесь используется класс RelativeLayout, который расширяет класс ViewGroup. Тогда скажем, я создаю кнопку внутри этого. Здесь начинается мой вопрос. Если посмотреть на пример, которому я следую, я увижу атрибуты, назначенные кнопке, принадлежащей классу RelativeLayout (то есть: android: layout_alignParentRight = "true"). Похоже, это параметры макета. Но почему это работает? Класс кнопки, кажется, наследуется от класса View. Почему объект кнопки может принимать атрибуты для объекта RelativeLayout? Может быть, мое программирование на Ruby сбивает меня с толку ..

Спасибо!

Обновление: ради потомков: спасибо Slothsberry за указание на ссылку XML Layouts , которая, по-видимому, четко описывает ответ в 2-х разделах раздела «Атрибуты» и «Параметры макета». Раздел атрибутов гласит:

Каждый объект View и ViewGroup поддерживает свои собственные разновидности XML атрибутов. Некоторые атрибуты относятся к объекту View (для Например, TextView поддерживает атрибут textSize), но они атрибуты также наследуются любыми объектами View, которые могут расширять это учебный класс. Некоторые являются общими для всех объектов View, потому что они наследуются из корневого класса View (как атрибут id). И другие атрибуты считаются «параметрами макета», которые являются атрибутами которые описывают определенные ориентации макета объекта View, как определяется родительским объектом ViewGroup этого объекта.

Раздел параметров макета, возможно, является разделом, который действительно отвечает на этот вопрос. Где говорится:

Каждый класс ViewGroup реализует вложенный класс, который расширяет ViewGroup.LayoutParams. Этот подкласс содержит типы свойств, которые определить размер и положение для каждого дочернего представления, в зависимости от группа просмотра. Как видно на рисунке 1, родительская группа представления определяет параметры макета для каждого дочернего представления (включая дочернее представление просмотр группы).

Они также дают хорошую диаграмму. Кажется, что начинающий программист должен признать, что, хотя на Java-классы ссылаются, XML действует больше как лист CSS, и что атрибуты сначала вычисляются во вложенном виде, а затем вычисляются и переносятся на их аналоги класса Java. В любом случае, это мое понимание:)

Ответы [ 4 ]

6 голосов
/ 08 ноября 2011

Параметры макета не отражают строго наследование объектов (как вы заметили). Причина состоит в том, что существует две части макета: настройка представления и параметризация родителя представления с использованием этого представления в качестве аргумента.

Таким образом, такие параметры, как android: layout_below, будут игнорироваться, если родительский макет не является RelativeLayout. С точки зрения ООП может иметь смысл поместить этот параметр в объект RelativeLayout. Но это то, как вы бы сделали это в коде Java.

В коде XML используется подход, согласно которому информация о ребенке содержится в нем. Параметры макета, для которых требуется родительский элемент, которого нет, будут игнорироваться при его раздутии. Это хорошая система, которую использует Android, чтобы сделать XML более читабельным и переносимым. И это не строго относится к структуре пакета класса, а скорее к интуитивному способу, которым люди думают о размещении вещей в макете.

3 голосов
/ 08 ноября 2011

Все элементы макета в Android наследуются от View, хотя многие косвенно.

Общий класс View имеет свойства (атрибуты), подходящие для ЛЮБОГО видимого элемента макета. для корневого макета некоторые свойства, такие как гравитация макета, размеры макета и т. д., устанавливаются системой (в большинстве случаев я считаю).

Если мой корневой макет является линейным, Android позволит мне иметь относительный макет, являющийся дочерним в корне. Android позволит мне устанавливать различные свойства макета для вложенного элемента, чтобы контролировать его рендеринг. Это работает так же для кнопки, и любой другой макет Android.

Если вас не волнует определенное свойство, не устанавливайте его. Они присутствуют, чтобы позволить вам контролировать экраны вашего приложения. Изучите XML-макеты или Hello Views , чтобы начать работу с деталями.

1 голос
/ 08 ноября 2011

вы немного запутались, этот параметр макета не владеет конкретным объектом XML. Если поместить его в один дочерний XML XXXView или XXXLAyout, он поймет, что его правая сторона должна быть в том же месте, что и родительское право.

Тогда, если вы не создадите макетпараметры для этого ребенка, ребенок будет пытаться унаследовать те из своих родителей.

0 голосов
/ 01 марта 2018

Макет

Макет представляет собой двухпроходный процесс: этап измерения и этап макета.Проход измерения реализован в measure(int, int) и представляет собой нисходящий обход дерева вида.Каждый вид проталкивает спецификации размеров вниз по дереву во время рекурсии.В конце прохода измерения каждое представление сохраняет свои измерения.Второй проход происходит в layout(int, int, int, int) и также сверху вниз.Во время этого прохода каждый родитель отвечает за позиционирование всех своих дочерних элементов с использованием размеров, вычисленных в проходе меры.

Когда возвращается метод measure () представления, его getMeasuredWidth() и getMeasuredHeight() значения должны быть установлены вместе со значениями для всех потомков этого представления.Измеренная ширина представления и измеренные значения высоты должны учитывать ограничения, накладываемые родителями представления.Это гарантирует, что в конце прохождения меры все родители примут все измерения своих детей.Родительское представление может вызывать measure () более одного раза для своих дочерних элементов.Например, родитель может измерить каждого дочернего элемента один раз с неопределенными измерениями, чтобы выяснить, насколько большим они хотят быть, а затем снова вызвать measure () для них с фактическими числами, если сумма всех неограниченных размеров детей слишком велика или слишком мала.

В проходе меры используются два класса для передачи измерений.Класс View.MeasureSpec используется представлениями, чтобы сообщить своим родителям, как они хотят быть измеренными и позиционированными.Базовый класс LayoutParams просто описывает, насколько большим должно быть представление для ширины и высоты.Для каждого измерения можно указать одно из следующих значений:

  • точное число
  • MATCH_PARENT, что означает, что представление хочет быть таким же большим, как его родитель (минус заполнение)
  • WRAP_CONTENT, что означает, что представление хочет быть достаточно большим, чтобы вместить его содержимое (плюс заполнение).

Существуют подклассы LayoutParams для различных подклассов ViewGroup.Например, AbsoluteLayout имеет свой собственный подкласс LayoutParams, который добавляет значения X и Y.

MeasureSpecs используются для передачи требований вниз по дереву от родителя к потомку.MeasureSpec может находиться в одном из трех режимов:

  • UNSPECIFIED: Это используется родителем для определения желаемого измерения дочернего представления.Например, LinearLayout может вызывать measure () для своего дочернего элемента с высотой, установленной в значение UNSPECIFIED, и шириной EXACTLY 240, чтобы выяснить, какой высоты дочернему представлению нужно присвоить ширину 240 пикселей.
  • EXACTLY: Это используется родителем для наложения точного размера на ребенка.Ребенок должен использовать этот размер и гарантировать, что все его потомки будут соответствовать этому размеру.
  • AT_MOST: он используется родителем для наложения максимального размера на ребенка.Ребенок должен гарантировать, что он и все его потомки будут соответствовать этому размеру.

Чтобы начать макет, позвоните по номеру requestLayout().Этот метод обычно вызывается представлением о себе, когда он считает, что он больше не может вписываться в его текущие границы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...