- Android: layout_gravity не работает должным образом
- Почему гравитация не работает применительно к Относительной компоновке?
- 6 ответов
- Посмотреть gravity и layout_gravity внутри Относительного макета
- Относительная компоновка с gravity
- Линейное расположение с gravity
- Финальные заметки
- Дополнительный XML
- Гравитация и layout_gravity на Android
- Заметки
- Связанный
Android: layout_gravity не работает должным образом
У меня есть простой LinearLayout с одним TextView и одним ImageView. Я хочу, чтобы текст в TextView был выровнен вправо, но результат показывает, что текст был выровнен слева. Что-то не так с моим макетом xml? Благодарю.
Спасибо, Майкл. Но обходной путь, о котором вы говорили, тоже не работает.
Я попытался использовать RelativeLayout, но это все равно дало мне результат: More Comments (Icon)
То, что я ожидал, больше комментариев (иконка)
Ниже приведен список RelativeLayout. Что-то не так с ним?
Следуя обходному пути в комментарии Майкла, у меня есть XML ниже. Я ожидал, что результатом будет:
Но фактический результат:
Поэтому обходной путь не работает для меня. Есть предположения?
LinearLayouts с горизонтальной ориентацией не поддерживают правую / левую гравитацию. Вы можете найти обходной путь здесь .
Я понял, что не так с моим xml. Я должен был использовать гравитацию вместо layout_gravity для выравнивания текста в TextView. Следующий XML работает так, как ожидалось.
Я выполнил только несколько проектов с помощью android, но android: layout_gravity указывает выравнивание для представления в родительском, android: gravity указывает выравнивание представлений, содержащихся в представлении, значение силы тяжести, которое вы указываете. Убедитесь, что у вас есть правильный. В документации не проводится различие между этими двумя.
Было бы проще помочь вам, если бы вы разместили образец XML.
Я вижу, что вы разместили XML сейчас. Это похоже на то, что у вас есть собственный набор атрибутов, но если вы выравниваете текст вправо, зачем вы его ставите первым в линейном макете? Я предлагаю изменить его, чтобы идти влево-вправо.
Вот какой код я написал для своего проекта. Он выполняет то, что вы ищете. Я бы просто изменил типы управления и т. Д., И вы должны быть выключены и запущены.
Источник
Почему гравитация не работает применительно к Относительной компоновке?
Я уже понимаю, что если я использую layout_gravity=»center_horizontal» в текстовом представлении, тогда текст будет центром. Но я не хочу использовать это, потому что я хочу иметь как можно меньше кода, и лучший способ сделать это — применить gravity=»center_horizontal» к моей относительной компоновке. Я также задаю этот вопрос, потому что меня беспокоит даже использование gravity или layout_gravity с относительными макетами. Как и во время моего исследования, я наткнулся на этот ответ.
Обратите внимание на часть, которая говорит:
Не используйте gravity / layout_gravity с RelativeLayout. Используйте их для представлений в LinearLayouts и FrameLayouts.
Хотя это кажется мне довольно очевидным из относительного макета Android-документации, в котором четко указан gravity в качестве допустимого атрибута, Google решил, что эти атрибуты будут использоваться с относительными макетами.
Если эта цитата верна, как мне центрировать виды в относительных макетах?
Также вот мой код:
Обратите внимание, что заголовок расположен не по центру
6 ответов
Посмотреть gravity и layout_gravity внутри Относительного макета
Мое первоначальное утверждение, что gravity и layout_gravity не должны использоваться в подпредставлениях RelativeLayout , было частично неверным. gravity на самом деле работает нормально. Однако layout_gravity не имеет никакого эффекта. Это можно увидеть в примере ниже. Светло-зеленый и светло-синий — это TextViews. Два других цвета фона — это RelativeLayouts.
Как видите, gravity работает, но layout_gravity не работает.
Относительная компоновка с gravity
Мой оригинальный ответ о gravity и layout_gravity связан с этими атрибутами, применяемыми к представлениям в ViewGroup (в частности, LinearLayout ), а не ViewGroup . Однако можно установить gravity и layout_gravity на RelativeLayout . layout_gravity будет влиять на то, как RelativeLayout располагается внутри своего родителя, поэтому здесь я не буду разбираться. Как gravity влияет на подпредставления, показано на рисунке ниже.
Я изменил ширину всех подпредставлений, чтобы происходящее было более понятным. Обратите внимание, что способ RelativeLayout обрабатывать гравитацию состоит в том, чтобы взять все подпредставления как группу и переместить их по макету. Это означает, что какой бы ни был самый широкий вид, будет определять, как все остальное позиционируется. Таким образом, гравитация в относительной компоновке, вероятно, полезна, только если все подпредставления имеют одинаковую ширину.
Линейное расположение с gravity
Когда вы добавляете gravity к LinearLayout , он организует подпредставления так, как и следовало ожидать. Например, можно «сохранить код», установив gravity для LinearLayout в center_horizontally . Таким образом, нет необходимости индивидуально устанавливать layout_gravity каждого подпредставления. Смотрите различные варианты на изображении ниже.
Обратите внимание, что когда представление использует layout_gravity , оно переопределяет гравитацию LinearLayout. (Это можно увидеть в заголовке для двух макетов на левом изображении. LinearLayout gravity был установлен в left и right , но в Когда позиционирование представлений в RelativeLayout, общий способ сделать это, добавив что-то вроде следующего в каждый вид: Если кто-то хочет установить все представления одновременно, LinearLayout , вероятно, будет лучше (или, возможно, с использованием стиля). XML для изображения «Просмотр gravity и layout_gravity внутри относительного макета» : XML для изображения «Относительная компоновка с гравитацией» : XML для изображения «Линейный макет с гравитацией» : TlDr: android: gravity Работает с RelativeLayout, вы можете перейти к нижней части, если вы не хотите читать объяснение РЕДАКТИРОВАТЬ это гигантская стена текста, пожалуйста, потерпите меня Это то, чего я хочу достичь: Почему это работает, а android:gravity ( очевидно ) нет? если ваша цель — поместить TextView в горизонтальный центр макета / экрана, вы должны сообщить RelativeLayout ! это достигается с помощью чего-то, называемого LayoutParams — это структуры данных, определенные каждым View , которые используются родителем представления (в данном случае RelativeLayout) скажем, ваш TextView имеет следующее LayoutParams : андроид : layout_centerHorizontal = » истина» Вы получите что-то вроде этого: Когда RelativeLayout распространяет свои дочерние представления по экрану, по пути запускается метод обратного вызова — onLayout (. ) — это часть более сложной последовательности методов, которая будет определять положение каждого дочернего View внутри RelativeLayout , это частично достигается путем доступа к LayoutParams в каждом дочернем View , в данном случае этой строке в вашем TextView ВНИМАНИЕ : источник бесконечной путаницы! Позиционирование вида внутри Layout s / ViewGroup s выполняется с помощью LayoutParam s вызовов onLayout Так получилось, что некоторые макеты, такие как FrameLayout , имеют LayoutParam с именем android: layout_gravity, что приводит к большой путанице со свойством android:gravity , которое может определить каждое представление, которое НЕ одинаково и даже не LayoutParam android:gravity используется любым представлением (например, TextView ) для размещения своего содержимого внутри. Пример: допустим, вы изменили TextView на очень высокий и хотите, чтобы текст находился внизу TextView, а не вверху TextView CENTERED в RelativeLayout , но текст находится в вершине «окна» . Давайте используем android: gravity для управления позицией текста ВНУТРИ TextView Результат: как и ожидалось, изменилось только внутри представления. TLDR Теперь, если вы хотите игнорировать все вышеперечисленное и по-прежнему использовать android: gravity с RelativeLayout, RelativeLayout является также View , поэтому у него есть свойство android: gravity, но вы должны удалите другие свойства или LayoutParams, которые будут переопределять поведение , определенное свойством android: gravity, и смотрите на android: gravity при работе с RelativeLayout У меня всегда были проблемы с RelativeLayouts и TextViews. Я думаю, что это связано с тем, что TextView рассчитывает его размер динамически, и это мешает ему хорошо работать с гравитацией макета. Это только одно мое предположение. Решение, которое я обычно принимаю, заключается в настройке горизонтального размера textview с помощью match_parent. Это может быть неоптимальным решением, но оно должно работать. Если вам нужен textView с фиксированным размером, вы можете поместить размер с фиксированным размером, и он должен работать, это создает проблемы только с wrap_content. Изменить: как предложено @Valentino S., добавив С wrap_content тоже должно работать. Причина в моей голове все та же: размер textView вычисляется позже. Указывает, как объект должен располагать свое содержимое по осям X и Y в пределах своих собственных границ. Поместите объект в горизонтальный центр его контейнера, не меняя его размера. Таким образом, android:gravity=»center_horizontal» будет центрироваться по горизонтали с RelativeLayout к его родителю. Не делая его центр контента горизонтальным. Помните, что android:layout_gravity используется для самого представления относительно родителя или макета. Помните, что поведение Layout может незначительно отличаться для каждого уровня API. И обратите внимание, что мы не можем на 100% быть уверены, что визуальный результат в Layout Editor правильный. Всегда проверяйте свой макет на реальных устройствах. Источник Я знаю, что мы можем установить следующие значения для свойств android:gravity and android:layout_gravity : Но я смущен в отношении обоих. В чем разница между использованием android:gravity и android:layout_gravity ? Их имена должны помочь вам: android:layout_gravity – это внешняя гравитация вида. Это означает, что нужно указать направление, в котором вид должен касаться границы его родителя. android:gravity – это внутренняя гравитация этого вида. Это означает, что в этом направлении содержимое должно совпадать. Эквиваленты HTML / CSS: android:layout_gravity = float в CSS android:gravity = text-align в CSS Легкий трюк, который нужно запомнить: возьмите «макет-гравитацию» как «Lay-outside-gravity» Внутри снаружи Иногда это помогает увидеть и картинку. Зеленые и синие – это TextViews а два других цвета фона – LinearLayouts . Поэтому помните, что макет _gravity упорядочивает представление в своем макете . Гравитация упорядочивает содержимое внутри представления. Вот xml для приведенного выше изображения для вашей справки: Короткий ответ: используйте android:gravity или setGravity() чтобы контролировать гравитацию всех видов ребенка в контейнере; Используйте android:layout_gravity или setLayoutParams() для управления гравитацией отдельного вида в контейнере. Длинная история: для управления гравитацией в линейном контейнере макета, таком как LinearLayout или RadioGroup , существует два подхода: 1) Чтобы контролировать гравитацию всех дочерних видов контейнера LinearLayout (как и в вашей книге), используйте метод android:gravity (не android:layout_gravity ) в формате XML-файла или setGravity() в коде. 2) Чтобы контролировать гравитацию детского вида в контейнере, используйте атрибут android:layout_gravity XML. В коде нужно получить LinearLayout.LayoutParams представления и установить его силу тяжести. Вот пример кода, который устанавливает кнопку внизу в горизонтально ориентированном контейнере: Для горизонтального контейнера LinearLayout горизонтальная гравитация его дочернего вида выравнивается по левому краю один за другим и не может быть изменена. Установка android:layout_gravity в center_horizontal не влияет. Вертикальная гравитация по умолчанию – центральная (или центральная) и может быть изменена на верхнюю или нижнюю. Фактически значение layout_gravity по умолчанию layout_gravity -1 но Android ставит его вертикально по центру. Чтобы изменить горизонтальные положения дочерних видов в горизонтальном линейном контейнере, можно использовать layout_weight , margin и padding дочернего представления. Аналогично, для вертикального контейнера View Group вертикальная гравитация его дочернего представления выравнивается по высоте одна под другой и не может быть изменена. По умолчанию горизонтальная гравитация является центральной (или center_horizontal ) center_horizontal и может быть изменена влево или вправо. Фактически, дочерний вид, такой как кнопка, также имеет атрибут android:gravity XML и метод setGravity() для управления его дочерними представлениями – текст в нем. Button.setGravity(int) связан с этой записью developer.android.com . Из того, что я могу собрать, layout_gravity – это серьезность этого представления внутри его родителя, а гравитация – это сила тяжести детей внутри этой точки зрения. Я думаю, что это правильно, но лучший способ узнать – это поиграть. Посмотрите на изображение, чтобы быть понятным о гравитации Хотя вопрос уже ответил, у меня есть несколько примеров, демонстрирующих использование силы тяжести, layout_gravity и layout_weight. Я создал файлы в Eclipse, удалил подпапки .svn и включил стили, строки, цвета и т. Д. Файлы макетов являются основной темой демонстраций. Поскольку я являюсь разработчиком Java и Android, можно найти Java неэффективным. Файлы могут быть скопированы в проект Eclipse или я также использовал их в Netbeans с плагином разработки Android, доступным для этой среды разработки. Если мы хотим установить серьезность содержимого внутри представления, мы будем использовать «android: gravity», и если мы хотим установить серьезность этого представления (в целом) в его родительском представлении, мы будем использовать «android: layout_gravity». Просто подумал, что я добавлю свое объяснение здесь – исходя из фона на iOS, вот как я усвоил эти два термина iOS: «Макет Gravity» влияет на вашу позицию в супервизии. «Гравитация» влияет на положение ваших подзонов внутри вас. С другой стороны, Layout Gravity позиционирует вас самостоятельно, в то время как гравитация позиционирует ваших детей. Что-то, что я видел в блоге Сандипа, которое я почти пропустил, исправил мою проблему. Он сказал, что layout_gravity не работает с LinearLayout . Если вы используете LinearLayout а настройки гравитации приводят вас в орехи (как и я), переключитесь на что-то еще. Я фактически переключился на RelativeLayout затем использовал layout_alignParentLeft и layout_alignParentRight на 2 содержащихся TextView s, чтобы получить их на одной строке, чтобы идти далеко влево и вправо. Существует много различий в gravity и layout-gravity . Я собираюсь объяснить свой опыт в отношении этих двух концепций ( вся информация, полученная из-за моего наблюдения и некоторых веб-сайтов ). Использование гравитации и макета гравитации в FrameLayout ….. Заметка:- Гравитация используется внутри Просмотр содержимого, так как у некоторых пользователей есть ответ, и он одинаковый для всех ViewGroup Layout . Layout-gravity используется с родительским представлением, поскольку у некоторых пользователей есть ответ. Gravity and Layout-gravity – это более полезная работа с FrameLayout . We can’t use Gravity and Layout-gravity в теге FrameLayout …. Мы можем установить Child View в любом месте в FrameLayout используя layout-gravity . Мы можем использовать каждое значение гравитации внутри FrameLayout (например: – center_vertical , center_horizontal , center , top и т. Д.), Но это невозможно с другими макетами ViewGroup. FrameLayout полностью работает над Layout-gravity . Пример: – Если вы работаете с FrameLayout вам не нужно менять весь макет для добавления нового представления. Вы просто добавляете View как последний в FrameLayout и даете ему Layout-gravity со значением. ( Это преимущества макета-гравитации с помощью FrameLayout ). Использование гравитации и макета гравитации в LinearLayout ….. Gravity работающая так же, как и выше, но здесь отличается тем, что мы можем использовать 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 childs в ту же позицию …. android:gravity используется, чтобы указать, как разместить содержимое объекта внутри самого объекта. Другими словами, андроид: гравитация используется для определения тяжести содержимого представления. android:layout_gravity – это атрибуция, которую ребенок может предоставить своему родителю, чтобы определить серьезность представления внутри своих родителей. Более подробную информацию вы можете посетить Основное различие между ними состоит в том, Android: гравитация используется для дочерних элементов представления. Android: layout_gravity используется для этого элемента относительно родительского представления. Легкий трюк, чтобы помнить об этом – сила тяжести относится к нам внутри Земли. Итак, android:gravity для внутреннего зрения. Вспомните, как вы выложите _gravity, который поможет вам запомнить этот android:layout_gravity будет ссылаться на внешний вид Гравитация используется для установки выравнивания текста в представлениях, но layout_gravity используется для установки собственных представлений. Давайте возьмем пример, если вы хотите выровнять текст, написанный в editText, затем использовать гравитацию, и вы хотите выровнять этот editText или любую кнопку или любое представление, а затем использовать layout_gravity, поэтому его очень просто. Используется для настройки содержимого представления относительно его заданной позиции (выделенной области). android:gravity=»left» ничего не сделает, если layout_width равно «wrap_content» Используется для представления относительно родительского или файла макета. Gravity: используется для простых представлений, таких как textview, edittext и т. Д. Layout_gravity : используется для родительских представлений, таких как линейный макет, чтобы сделать вид в центре его родителей. android:gravity -> Устанавливает гравитацию содержимого вида, в котором он используется. android:layout_gravity -> Устанавливает серьезность представления родителя или макета ИсточникФинальные заметки
Дополнительный XML
Гравитация и layout_gravity на Android
Заметки
Связанный