Какая разница между android: height и android: layout_height?
<TextView
android:layout_width="match_parent"
android:layout_height="48dp"
android:paddingTop="48dp"
android:text="Test"
/>
Я ожидал бы, что TextView будет иметь измеренную высоту 96dp, независимо от того, сколько пространства (по высоте) "Тест" занял (ожидал бы, что он отключится).
Вместо этого я получаю полный "Test" + 48dp для заполнения.
Я могу поместить любое допустимое значение для layout_height
и получить тот же результат.
Чтобы получить высоту 96dp, мне нужно:
<TextView
android:layout_width="match_parent"
android:layout_height="<any valid value>"
android:height="48dp"
android:paddingTop="48dp"
android:text="Test"
/>
где снова я могу положить layout_height
как любое допустимое значение (но оно должно быть там как обязательный атрибут).
Я никогда не использовал атрибут height
в XML, но я не мог найти разницу в документах, особенно, как каждый из них вычисляется, когда элемент, в котором он работает, также имеет значения, установленные для заполнения и/или поля.
Есть ли доступные ресурсы, которые обсуждают это, или кто-нибудь может объяснить это здесь?
Изменить (сводка вопросов):
Это может быть ситуация, в которой я ее использовал, что вызывало проблему, поэтому мои примеры из выше можно игнорировать (я попытался в новом проекте и получил разные результаты из сочетаний атрибутов).
Но мои исходные вопросы по-прежнему применяются (некоторые перекрытия):
- какая разница между ними?
- когда нужно использовать другой?
- Использование одного влияет на использование другого?
- Может ли использование одного из них повлиять на другие атрибуты, которые могут контролировать измеренные размеры представления, такие как заполнение или маржа?
Изменить 2 (в сторону):
В случае, если это поможет понять мою первоначальную ситуацию по сравнению со свежим проектом:
У меня есть действие, которое устанавливает windowActionBarOverlay
как true, поэтому я получаю свой контент, текущий под (полупрозрачным) ActionBar.
Я также использую Croutons, которые теперь появляются под ActionBar. Бен Вейс предположил, что я присоединяю Crouton к другой группе ViewGroup, но я не был уверен, какую ViewGroup присоединить к ней.
Вместо этого я предоставил настраиваемое представление (которое накачивается, когда это необходимо) как Crouton (TextView из первой части вопроса) с верхним дополнением, равным верхнему значению ActionBar, поэтому теперь оно отображается вертикально ниже ActionBar как обычно (с другими проблемами в течение другого дня).
Ответы
Ответ 1
Вопрос 1:
Все атрибуты, начинающиеся с "layout_", являются подсказками для ViewGroup View является частью. Для этого каждый android.view.ViewGroup
имеет набор LayoutParams. Сам виджет не использует их.
Параметр android:height
- это начальный размер android.view.View
. Но если View является частью ViewGroup
, то ViewGroup
изменит размер объекта в соответствии с его правилами компоновки.
BTW: новые API имеют новый атрибут android:minHeight
и android:maxHeight
, чтобы уточнить намерения программистов.
Обратите внимание, что если вы не установите android:height
, представление вычислит сам размер. Что правильно делать большую часть времени.
Вопрос 2:
ViewGroup
является абстрактным - ответ на этот вопрос зависит от того, какой фактический класс ребенка вы используете.
Обратите внимание, что WRAP_CONTENT
указывает использовать ViewGroup
для использования android:height
. Это означает, что это правильный параметр, который будет использоваться в вашем примере.
Вопрос 3:
Да - и рекурсивно. TableLayout будет читать и писать атрибут android:width
, чтобы узнать самый широкий объект и изменить его все остальные объекты.
Вопрос 4:
Нет для android:padding
, но да для android:layout_margin
. Обратите внимание, что поля являются параметрами макета, и не каждый менеджер макетов поддерживает поля.
Подробнее см. margin vs padding.
Заключительные слова:
Легче рассматривать атрибуты ширины и высоты только подсказки. В последнем случае размер объекта имеет менеджер компоновки используемого ViewGroup
.
Ответ 2
Из-за этого немного, я думаю, что layout_height
является гибким - предпочтительная высота, но все равно будет расширяться/сокращаться с содержимым - и height
- определенное значение.
Что происходит в вашем случае, так это то, что TextView обтекает текст Test
, но все еще использует атрибут 48dp paddingTop
.
Ответ 3
Ну, android_layout: height указывает базовую высоту VIEW, тогда как android: height задает высоту объекта (например, кнопку в xml).
Удачи!:)
Ответ 4
android: height делает представление таким же высоким, как и многие высокие пиксели, в то время как android: layout_height указывает базовую высоту представления.