Android layout gravity bottom center

Полный список

На этом уроке мы:

— разбираемся в характеристиках экрана
— рассматриваем layout параметры (высота, ширина, отступ, гравитация, вес)

Экраны

Для начала немного теории по экранам. Экран имеет такие физические характеристики как диагональ и разрешение. Диагональ – это расстояние между противоположными углами экрана, обычно измеряется в дюймах. Разрешение – кол-во точек по горизонтали и вертикали, которое экран способен отобразить, измеряется в пикселах.

Возьмем в качестве примера экран смартфона HTC Desire. Диагональ = 3,7 дюйма, разрешение = 800х480 пикселей.

Кол-во пикселей в одном дюйме называется dpi (dot per inch). Узнаем чему равно dpi в данном случае, вспомнив классику: c 2 = a 2 + b 2 , где с – кол-во пикселей по диагонали, т.е. вмещаемое в 3,7 дюйма. a и b – стороны экрана.

c = 3,7 * dpi
(3,7 * dpi) 2 = 480 2 + 800 2
dpi 2 = 870400 / 13,69 = 63579
dpi = 252. Т.е. в одном дюйме экрана помещается ряд из 252 пикселей.

Возвращаемся к теме урока. Рассмотрим подробно следующие параметры View элементов

Layout width и Layout height

Про ширину (layout_width) и высоту (layout_height) мы уже немного говорили на прошлом уроке. Мы можем указывать для них абсолютные значения, а можем использовать константы. Разберем подробнее эти возможности.

Абсолютные значения:

Используются следующие единицы измерения (ЕИ):

dp или dip — Density-independent Pixels. Абстрактная ЕИ, позволяющая приложениям выглядеть одинаково на различных экранах и разрешениях.

sp — Scale-independent Pixels. То же, что и dp, только используется для размеров шрифта в View элементах

pt — 1/72 дюйма, определяется по физическому размеру экрана. Эта ЕИ из типографии.

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

mm – миллиметр, определяется по физическому размеру экрана

in – дюйм, определяется по физическому размеру экрана

Подробней о различиях и соотношениях между этими ЕИ вы можете прочесть в этом материале сайта.

Константы

match_parent (fill_parent) – означает, что элемент займет всю доступную ему в родительском элементе ширину/высоту.

wrap_content – ширина/высота элемента будет определяться его содержимым

Project name: P0072_LayoutProp
Build Target: Android 2.3.3
Application name: LayoutProp
Package name: ru.startandroid.develop.layoutprop
Create Activity: MainActivity

Открываем main.xml. Настроим корневой LinearLayout на горизонтальную ориентацию, удалим TextView, и добавим Button с шириной и высотой равной wrap_content. Она отображается на экране и ее ширина соответствует тексту на ней.

Изменим текст с «Button» на «Button with text», сохраним и посмотрим на экран.

Кнопка стала шире, т.к. ширина определяется по содержимому. Если же мы сейчас явно укажем ей ширину 250 dp, то кнопка растянется независимо от содержимого.

Теперь сделаем ширину равной match_parent. Кнопка растянулась на всю ширину родителя, т.е. LinearLayout. А LinearLayout в свою очередь занимет всю ширину экрана.

Если у нас родитель содержит несколько элементов и мы хотим, чтобы они заняли все пространство необходимо использовать параметр Layout weight – вес. Свободное пространство распределяется между элементами пропорционально их weight-значениям.

Изменим текст нашей кнопки на B1 и добавим ей соседа по LinearLayout – вторую кнопку с текстом B2. Ширину для обоих поставьте wrap_content

Займемся дележом. Если мы хотим, чтобы кнопки поделили пространство родителя поровну – то для обеих укажем weight = 1. В этом случае кнопки равны по ширине.

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

Если нужно, чтобы B1 занимала четверть, а B2 три четверти свободного пространства, то проставляем weight = 1 для B1 и weight = 3 для B2.

Кол-во элементов может быть любым. Добавим еще кнопку с текстом B3, weight = 2 и width = wrap_content.

xml-код получившегося экрана:

Теперь для B2 и B3 укажите weight = 0. Они больше не претендуют на свободное пространство и занимают ширину по содержимому, а B1 забирает все себе.

Разумеется, все выше сказанное применимо и для параметра высоты — height.

При использовании weight вы можете указать значение height или width = 0dp. В этом случае не будет учитываться содержимое элементов и результат будет более соответствующий коэффициентам веса.

Layout gravity

Параметр layout_gravity аналогичен выравниванию из Word или Excel. Удобнее всего продемонстрировать его с использованием FrameLayout. Я не описывал этот Layout на прошлом уроке, т.к. он совсем простой. Все помещаемые в него элементы он по умолчанию помещает в левый верхний угол и никак их не выстраивает. Нам это очень подходит для демонстрации настроек выравнивания.

Создадим grlayout.xml:

На экране видим:

Для наглядности текст кнопки отображает ее свойства. Все очевидно и несложно.

Читайте также:  Как удалить яндекс карты с андроида

Я честно пытался понять зачем нужны значения gravity fill_* и clip_*, но так и не понял. То, что написано про них в хелпе у меня не работает. Если у вас есть сведения по этому поводу – пишите в каменты.

Layout margin

Параметры margin полностью аналогичны margin из html. Это отступ. Он может быть со всех сторон сразу, либо только с необходимых сторон. Продемонстрируем это на примере TableLayout. Создадим marginlayout.xml и нарисуем таблицу три на три с кнопками.

И на кнопке в центре будем экспериментировать.

margin = 50 dp
Вокруг кнопки со всех сторон образовался отступ = 50 dp.

margin left = 10 dp
margin top = 20 dp
Отступ слева и сверху.

margin right = 30 dp
margin bottom = 40 dp
Отступ справа и снизу.

Урок получился большой, но полезный. Думаю, это был последний урок дизайна, моделирования и верстки и дальше мы уже начнем кодить.

Стили

Если кто использовал HTML, то наверняка слышали про каскадные стили — CSS. Стили позволяют вам группировать атрибуты элементов (кнопок, таблиц, параграфов и т.д.). Далее вы просто применяете к элементам стили, и элемент рисуется с учетом всех атрибутов стиля. И нет необходимости повторять несколько раз один и тот же код для элементов, которые должны выглядеть одинаково. Особенно это удобно в случае изменения атрибутов. Вы просто меняете один раз стиль и все элементы с этим стилем меняются.

В Android тоже есть стили и они имеют точно такое же назначение. Если у вас есть несколько элементов и вам надо, чтобы они выглядели одинаково, то вы просто создаете один стиль и применяете его к нужным элементам. В принципе, вы пока можете не заморачиваться этим и начать использовать стили, когда наберетесь опыта. Ну а тем кому это интересно прямо сейчас — прошу в эту ветку нашего форума. Пользователь icamys на примере подробно разъясняет как использовать стили.

На следующем уроке:

— научимся обращаться к View-элементам из кода и менять их свойства

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Android: выдвигающийся экран снизу

Данная статья является переводом статьи Emrullah Luleci, а также её продолжения.

Нижний экран (Здесь и далее под «нижним экраном/слоем» будет подразумеваться элемент bottom sheet — прим. пер.) — компонент, выезжающий снизу экрана, который используется для отображения дополнительного контента. Подробнее об этом элементе можно узнать на официальной сайте посвященном материальному дизайну.

Зависимости

Для использования этого элемента, добавьте последние версии библиотек поддержки в свой проект:

Создайте класс наследник от AppCompatActivity:

Создание макетов

Содержимое нижнего экрана

Для удобства воспользуемся макетами. Назовем файл с нижним слоем bottom_sheet.xml.

behavior_peekHeight: Определяет высоту видимой части.

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

Container view

Создайте CoordinatorLayout в качестве корневого вью. Добавьте в него прямым наследником bottom_sheet.xml. Элементы app_bar и activity_bottom_sheet_content не имеют прямого отношения к нижнему экрану, поэтому их можно заменить или удалить.

На данном этапе нижний экран должен работать примерно так:

Динамическое управление

Поведением и свойствами нижнего экрана можно также управлять динамически с помощью Java.

Прикрепление элементов к нижнему экрану

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

Добавим Floating Action Button в макет созданный выше. Новый компонент должен являться непосредственным наследником CoordinatorLayout также как и bottom_sheet. Для прикрепления элемента к нижнему экрану необходимо добавить app:layout_anchor с id вью нижнего экрана, а также app:layout_anchorGravity со значением top|end.

Теперь плавающая кнопка закреплена в верхнем углу нашего нижнего экрана и перемещается вместе с ним.

Скрытие плавающей кнопки при скроле

Для скрытия кнопки при скроле необходимо добавить слушатель к нижнему экрану и отображать/скрывать кнопку. Для начала найдем необходимые вью:

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

Результат обоих вариантов можно увидеть ниже:

Источник

Разница между гравитацией и гравитацией макета на Android

Я знаю, что мы можем установить следующие значения android:gravity и android:layout_gravity свойства:

  1. center
  2. center_vertical
  3. center_horizontal , etc.

но я смущен в отношении обоих из них.

в чем разница между использованием android:gravity и android:layout_gravity ?

19 ответов

их имена должны помочь вам:

  • android:gravity устанавливает серьезность содержимого (т. е. его подвидов) View Он используется.
  • android:layout_gravity устанавливает гравитацию View или Layout относительно его родителя.
Читайте также:  Мобильная разработка под android уроки

разница

android:layout_gravity это за пределами гравитация вида. Указывает направление, в котором представление должно касаться границы своего родителя.

android:gravity — это внутри гравитация этого вида. Указывает, в каком направлении должно выравниваться его содержимое.

эквиваленты HTML/CSS

простой трюк, чтобы помочь вам вспомнить

взять layout-gravity как «Lay-outside-gravity».

  • gravity содержимое веб-страницы внутри вид.
  • layout_gravity упорядочивает положение вида за пределами сам по себе.

иногда это помогает увидеть картину, тоже. Зеленый и синий TextViews и два других цвета фона LinearLayouts .

Примечания

  • на layout_gravity не работает для представлений в RelativeLayout . Используйте его для просмотра в LinearLayout или FrameLayout . Смотрите мой дополнительный ответ для получения более подробной информации.
  • ширина (или высота) представления должна быть больше его содержимого. В противном случае gravity не будет иметь никакого эффекта. Таким образом, wrap_content и gravity бессмысленны вместе.
  • ширина вида (или высота) должно быть меньше, чем у родителя. В противном случае layout_gravity не будет иметь никакого эффекта. Таким образом, match_parent и layout_gravity бессмысленны вместе.
  • на layout_gravity=center выглядит так же, как layout_gravity=center_horizontal здесь, потому что они находятся в вертикальной линейной компоновки. В этом случае вы не можете центрироваться вертикально, поэтому layout_gravity=center только центры по горизонтали.
  • этот ответ касался только настройки gravity и layout_gravity о представлениях в макете. Чтобы увидеть, что произойдет, когда вы установите gravity родительского сам макет, проверьте дополнительный ответ что я упоминал выше. (Резюме: gravity не работает с RelativeLayout но может быть полезно с LinearLayout .)

запомните, планировка_gravity устраивает вид в своем планировка. Gravity упорядочивает содержимое внутри представления.

вот xml для вышеуказанного изображения для вашего ссылка:

по теме

короткий ответ: используйте android:gravity или setGravity() для управления гравитацией всех дочерних представлений контейнера; используйте android:layout_gravity или setLayoutParams() для управления гравитацией отдельного вида в контейнере.

длинная история: для управления гравитацией в линейном контейнере макета, таком как LinearLayout или RadioGroup , есть два подхода:

1) для управления гравитацией всех дочерних представлений a LinearLayout контейнер (как вы сделали в своей книге), используйте android:gravity (не android:layout_gravity ) в XML-файл макета или setGravity() метод в коде.

2) для управления гравитацией дочернего вида в его контейнере используйте android:layout_gravity атрибут XML. В коде нужно получить LinearLayout.LayoutParams вида и установить его гравитацию. Вот пример кода, который устанавливает кнопку снизу в горизонтально ориентированном контейнере:

горизонтальный LinearLayout контейнер, горизонтальная гравитация его дочернего вида выравнивается слева один за другим и не может быть изменена. Настройка android:layout_gravity to center_horizontal не имеет никакого эффекта. Этот вертикальная гравитация по умолчанию является центральной (или center_vertical) и может быть изменена на верхнюю или нижнюю. На самом деле по умолчанию layout_gravity значение -1 но Android поставил его в центр вертикально.

чтобы изменить горизонтальное положение дочерних представлений в горизонтальном линейном контейнере, можно использовать layout_weight , margin и padding мнение ребенка.

аналогично, для контейнера группы вертикального вида вертикальная гравитация его дочернего вида выровнена сверху вниз и не может быть измененный. Горизонтальная гравитация по умолчанию-center (или center_horizontal ) и может быть изменен влево или вправо.

на самом деле, дочерний вид, такой как кнопка, также имеет android:gravity атрибут XML и setGravity() метод управления дочерними представлениями — текст в нем. The Button.setGravity(int) связано с этим developer.android.com запись.

из того, что я могу собрать layout_gravity — это гравитация этого вида внутри его родителя, и гравитация это серьезность детей внутри этого представления.

Я думаю, что это правильно, но лучший способ узнать, чтобы играть вокруг.

посмотрите на изображение, чтобы быть ясным о гравитации

хотя на вопрос уже дан ответ, у меня есть несколько образцов, демонстрирующих использование гравитации, layout_gravity и layout_weight.

Я создал файлы в Eclipse, удалены .svn вложенные папки и включили стили, строки,цвета и т. д. Файлы макета суть Демы. Поскольку я новичок в разработке Java и Android, можно найти Java неэффективный. Файлы могут быть скопированы в проект Eclipse, или я также использовал их в Netbeans с плагином разработки Android, доступным для этой IDE.

Если мы хотим установить гравитацию содержимого внутри представления, мы будем использовать «android: gravity», и если мы хотим установить гравитацию этого представления (в целом) в его родительском представлении, то мы будем использовать»android:layout_gravity».

просто подумал, что я добавлю свое собственное объяснение здесь-исходя из фона на iOS, вот как я усвоил эти два термина в iOS: «гравитация макета» влияет на вашу позицию в супервизоре. «Гравитация» влияет на положение ваших подвидов внутри вас. Иначе говоря, макет тяжести позиции вы себя при гравитационном позиций ваших детей.

существует много различий в gravity и layout-gravity . Я собираюсь объяснить свой опыт об этих 2 понятиях (вся информация, которую я получил из-за моего наблюдения и некоторых веб-сайтов).

использование гравитации и компоновки-гравитация в FrameLayout .

Примечание:

Читайте также:  Гугл хром как добавить быструю ссылку андроид

гравитация используется внутри Просмотр Содержимого как у некоторых пользователей есть ответ и он такой же для всех ViewGroup Layout .

Layout-gravity используется с родительским представлением, поскольку у некоторых пользователей есть ответ.

Gravity and Layout-gravity и работа более полезная С FrameLayout Чайлдс . We can’t use Gravity and Layout-gravity в теге FrameLayout .

мы можем установить Дочерний вид в любом месте в FrameLayout используя layout-gravity .

мы можем использовать каждое одиночное значение силы тяжести внутри FrameLayout (например: — center_vertical , center_horizontal , center , top и т. д.), Но это невозможно с другими макетами ViewGroup .

FrameLayout на Layout-gravity . Пример: — Если вы работаете на FrameLayout затем не нужно менять весь план для добавления нового представления. Ты просто добавить вид как последний в FrameLayout и дал ему Layout-gravity С значение.(это adavantages макета-гравитации с FrameLayout).

использование гравитации и компоновки-гравитация в LinearLayout .

Gravity работает так же, как и выше, но здесь разницу в том, что мы можем использовать гравитацию внутри LinearLayout View и RelativeLayout View что невозможно в FrameLayout View .

LinearLayout с ориентацией по вертикали .

Примечание.:- Здесь мы можем установить только 3 значения layout_gravity то есть ( left | right | center (также называемый center_horizontal )).

LinearLayout с ориентацией по горизонтали .

Примечание:- здесь мы можем установить также 3 значения layout_gravity то есть ( top | bottom | center (также называемый center_vertical )).

Примечание: — мы не можем использовать layout_gravity на RelativeLayout Views но мы можем использовать gravity установить RelativeLayout Чайлдс в том же положении.

то, что я увидел в блоге Сандипа, что я почти пропустил, исправил мою проблему. Он сказал layout_gravity НЕ РАБОТАЕТ С LinearLayout .

если вы используете LinearLayout и настройки гравитации сводят вас с ума (как и я), а затем переключитесь на что-то другое.

я фактически переключился на используется layout_alignParentLeft и layout_alignParentRight на 2 содержатся TextView s, чтобы получить их на одной линии, чтобы перейти левой и правой.

легкий трюк, чтобы помнить, что это гравитация относится к нам внутри Земли. Итак, android:gravity на внутри вид.

помнят из на лежализ_gravity что поможет вам запомнить это android:layout_gravity будет относиться к за пределами вид

android:gravity используется для указания того, как разместить содержимое объекта внутри самого объекта. Другими словами, android: gravity используется для указания тяжести содержимого представления.

android:layout_gravity является атрибуцией, которую ребенок может предоставить своему родителю, чтобы указать серьезность представления внутри своих родителей.

для более подробной информации вы можете посетить

основное различие между ними заключается в том, что —

android:гравитация используется для дочерних элементов представления.

android: layout_gravity используется для этого элемента относительно родительского вида.

серьезность: позволяет перемещать содержимое внутри контейнера. (Как будут размещены подвиды).

важно: (перемещение вдоль оси X или оси Y в пределах доступного пространства).

пример: предположим, если вы должны были работать с LinearLayout (Height: match_parent, Width: match_parent) в качестве элемента корневого уровня, то у вас будет полное пространство кадра; и дочерние представления говорят 2 TextViews (Height: wrap_content, Width: wrap_content) внутри LinearLayout можно двинуть вокруг вдоль оси x/y используя соответствуя значения для силы тяжести на родителе.

Layout_Gravity: позволяет переопределить родительское поведение гравитации только вдоль оси X.

важно: (перемещение[переопределение] вдоль оси X в пределах доступного пространства).

пример: Если вы помните предыдущий пример, мы знаем, что гравитация позволила нам двигаться вдоль оси x/y, i.e; место TextViews внутри LinearLayout. Скажем, LinearLayout указывает gravity: center; то есть каждый TextView должен быть центром как по вертикали, так и по горизонтали. Теперь, если мы хотим, чтобы один из TextView шел влево/вправо, мы можем переопределить указанное поведение гравитации, используя layout_gravity в TextView.

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

гравитация используется для установки выравнивания текста в представлениях, но layout_gravity используется для установки представлений. Давайте возьмем пример, если вы хотите выровнять текст, написанный в editText, а затем использовать гравитацию, и вы хотите выровнять этот editText или любую кнопку или любое представление, а затем использовать layout_gravity, поэтому его очень просто.

гравитация: используется для простых представлений, таких как textview, edittext и т. д.

layout_gravity: используется для текущего вида только гравитации в контексте его относительного родительского вида, такого как линейный макет или FrameLayout, чтобы сделать вид в центре или любой другой гравитации его родителя.

используется для настройки содержимого представления относительно его заданной позиции (выделенной области). android:gravity=»left» не сделал бы ничего, если layout_width равна «wrap_content»

используется для самого представления относительно родительского файла или файла макета.

android:gravity — > устанавливает серьезность содержимого вида, на котором он используется.

android:layout_gravity — > устанавливает гравитацию родительского вида или макета

Источник

Оцените статью