Nano Hash - криптовалюты, майнинг, программирование

Почему гравитация не работает при применении к относительной компоновке?

Я уже понимаю, что если я использую layout_gravity="center_horizontal" в текстовом представлении, то текст будет по центру. Но я не хочу использовать это, потому что я хочу иметь как можно меньше кода, и лучший способ сделать это - применить gravity="center_horizontal" к моему относительному макету. Я также задаю этот вопрос, потому что меня беспокоит даже использование gravity или layout_gravity с относительными макетами. Как и во время исследования, я наткнулся на этот ответ.

Обратите внимание на часть, которая говорит:

Не используйте gravity / layout_gravity с RelativeLayout. Используйте их для представлений в LinearLayouts и FrameLayouts.

Хотя мне это кажется довольно очевидным из относительного макета, Документация по Android, в котором gravity явно указан как допустимый атрибут, Google намеревался использовать эти атрибуты с относительными макетами.

Если эта цитата верна, как мне центрировать виды в относительных макетах?

Также вот мой код:

Обратите внимание, что заголовок не центрирован по горизонтали

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:gravity="center_horizontal"
    tools:context="com.something">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/TextAppearance.AppCompat.Title"
        android:textAlignment="center"
        android:text="@string/app_title"
        android:layout_marginBottom="@dimen/main_spacing"
        android:textSize="24sp" />

    <AutoCompleteTextView
        android:id="@+id/enterContact"
        android:text="Enter Contact"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:layout_below="@+id/title"
        android:layout_marginBottom="@dimen/main_spacing" />

</RelativeLayout>

введите описание изображения здесь


Ответы:


1

Это дополнительный ответ на Gravity и layout_gravity на Android.

Просмотр gravity и layout_gravity внутри относительного макета

Мое первоначальное утверждение, что gravity и layout_gravity не должны использоваться в подпредставлениях RelativeLayout, было частично неверным. gravity действительно работает нормально. Однако layout_gravity не действует. Это можно увидеть на примере ниже. Светло-зеленый и голубой - это TextView. Два других цвета фона - 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, но заголовок TextView layout_gravity был установлен на center_horizontally.)

Заключительные примечания

При позиционировании представлений в RelativeLayout общий способ do it добавляет в каждое представление что-то вроде следующего:

  • layout_alignParentTop
  • layout_centerVertical
  • layout_below
  • layout_toRightOf

Если кто-то хочет установить все представления сразу, вероятно, будет лучше LinearLayout (или, возможно, с использованием стиля).

Итак, чтобы подвести итог,

  • layout_gravity не работает для вложенных представлений в RelativeLayout.
  • gravity RelativeLayout работает, но не так, как можно было бы ожидать.

Дополнительный XML

XML для изображений Просмотр gravity и layout_gravity в относительном макете:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#e3e2ad" >

        <TextView
            android:id="@+id/tvTop1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:textSize="24sp"
            android:text="Views' gravity=" />

        <!-- examples of gravity -->
        
        <TextView
            android:id="@+id/tvTop2"
            android:layout_below="@id/tvTop1"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="left"
            android:text="left" />

        <TextView
            android:id="@+id/tvTop3"
            android:layout_below="@id/tvTop2"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center_horizontal"
            android:text="center_horizontal" />

        <TextView
            android:id="@+id/tvTop4"
            android:layout_below="@id/tvTop3"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="right"
            android:text="right" />

        <TextView
            android:id="@+id/tvTop5"
            android:layout_below="@id/tvTop4"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center"
            android:text="center" />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#d6c6cd" >

        <TextView
            android:id="@+id/tvBottom1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:textSize="24sp"
            android:text="Views' layout_gravity=" />

        <!-- examples of layout_gravity -->
        
        <TextView
            android:id="@+id/tvBottom2"
            android:layout_below="@id/tvBottom1"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="left"
            android:background="#bcf5b1"
            android:text="left" />

        <TextView
            android:id="@+id/tvBottom3"
            android:layout_below="@id/tvBottom2"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="center_horizontal"
            android:background="#aacaff"
            android:text="center_horizontal" />

        <TextView
            android:id="@+id/tvBottom4"
            android:layout_below="@id/tvBottom3"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="right"
            android:background="#bcf5b1"
            android:text="right" />

        <TextView
            android:id="@+id/tvBottom5"
            android:layout_below="@id/tvBottom4"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:background="#aacaff"
            android:text="center" />

    </RelativeLayout>

</LinearLayout>

XML для изображения Относительный макет с гравитацией:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:background="#e3e2ad" >

        <TextView
            android:id="@+id/tvTop1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            android:text="Views' gravity=" />

        <!-- examples of gravity -->

        <TextView
            android:id="@+id/tvTop2"
            android:layout_below="@id/tvTop1"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="left"
            android:text="left" />

        <TextView
            android:id="@+id/tvTop3"
            android:layout_below="@id/tvTop2"
            android:layout_width="300dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center_horizontal"
            android:text="center_horizontal" />

        <TextView
            android:id="@+id/tvTop4"
            android:layout_below="@id/tvTop3"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="right"
            android:text="right" />

        <TextView
            android:id="@+id/tvTop5"
            android:layout_below="@id/tvTop4"
            android:layout_width="150dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center"
            android:text="center" />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
        android:background="#d6c6cd" >

        <TextView
            android:id="@+id/tvBottom1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            android:text="Views' gravity=" />

        <!-- examples of layout_gravity -->

        <TextView
            android:id="@+id/tvBottom2"
            android:layout_below="@id/tvBottom1"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:gravity="left"
            android:background="#bcf5b1"
            android:text="left" />

        <TextView
            android:id="@+id/tvBottom3"
            android:layout_below="@id/tvBottom2"
            android:layout_width="300dp"
            android:layout_height="40dp"
            android:gravity="center_horizontal"
            android:background="#aacaff"
            android:text="center_horizontal" />

        <TextView
            android:id="@+id/tvBottom4"
            android:layout_below="@id/tvBottom3"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:gravity="right"
            android:background="#bcf5b1"
            android:text="right" />

        <TextView
            android:id="@+id/tvBottom5"
            android:layout_below="@id/tvBottom4"
            android:layout_width="150dp"
            android:layout_height="40dp"
            android:gravity="center"
            android:background="#aacaff"
            android:text="center" />

    </RelativeLayout>

</LinearLayout>

XML для изображения Линейный макет с гравитацией:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:background="#e3e2ad"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textSize="24sp"
            android:text="View's gravity=" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="left"
            android:text="left" />

        <TextView
            android:layout_width="300dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center_horizontal"
            android:text="center_horizontal" />

        <TextView
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="right"
            android:text="right" />

        <TextView
            android:layout_width="150dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center"
            android:text="center" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
        android:background="#d6c6cd"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textSize="24sp"
            android:text="View's gravity=" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="left"
            android:text="left" />

        <TextView
            android:layout_width="300dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center_horizontal"
            android:text="center_horizontal" />

        <TextView
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="right"
            android:text="right" />

        <TextView
            android:layout_width="150dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center"
            android:text="center" />

    </LinearLayout>

</LinearLayout>
10.02.2017

2

Тестирую ваш макет, у меня он работает (TextView отцентрирован правильно).

Однако вы также можете удалить android:gravity="center_horizontal" из RelativeLayout и добавить android:layout_centerHorizontal="true" в TextView.

09.02.2017
  • хм, у тебя это работает? Я только что протестировал свой телефон, но он не работает. Похоже, что показывает последнее опубликованное мною изображение, где левая часть заголовка совмещена с левой стороной родителя. 09.02.2017
  • Хорошо, проблема в том, что у меня есть autocompletetextview как дочерний элемент относительного макета. По какой-то причине это убивает настройку гравитации. Я добавил еще код, который на этот раз не работает. 09.02.2017
  • Тестирование со свойством android:layout_centerHorizontal="true" в TextView, он работает нормально 09.02.2017
  • да, я имею в виду, я ценю вашу помощь. Я просто смотрел, смогу ли я понять, почему я не могу просто применить одну строку кода ко всем дочерним элементам в относительном макете (то есть гравитацию в относительном макете) и сделать все по центру, но это просто не работает для меня, и я Думаю, мне просто нужно принять тот факт, что дизайн макета Android супер глючный. 09.02.2017
  • Да, в этом конкретном случае я не знаю, почему это не работает 09.02.2017
  • Однако обратите внимание, что если вы поместите один TextView под другим (не AutocompleteTextView), гравитация в RelativeLayout сработает. 09.02.2017
  • Также обратите внимание, что если вы установите android:layout_width="wrap_content" в AutoCompleteTextView, гравитация работает !! Так что это очень специфическая проблема AutoCompleteTextView и android:layout_width="match_parent" 09.02.2017
  • вы правы, но гравитация по-прежнему работает только с верхним элементом, остальные элементы выровнены по левой стороне верхнего элемента: P 09.02.2017
  • Я имею в виду: если вы удалите AutoCompleteTextView и поместите другие TextView один под другим, гравитация, установленная на уровне RelativeLayout, будет работать на всех TextView (только что протестированных) 09.02.2017
  • поэтому кажется, что он работает только с текстовыми представлениями, что-либо еще, например, кнопка или переключатель и т.д., делает это выравнивание по левому краю 09.02.2017
  • На самом деле он работает со всеми компонентами, кроме AutoCompleteTextView (с android:layout_width="match_parent). Можете попробовать протестировать с другими компонентами, все должно работать. На самом деле, я предполагаю, что он работает со всеми компонентами (также с AutoCompleteTextView) при условии, что все установлены android:layout_width="wrap_content. 09.02.2017
  • Привет, Валентино, просто хотел сообщить, что на этот вопрос был опубликован хорошо принятый ответ на случай, если тебе интересно. Важно знать: какой вид будет самым широким, будет определять расположение всего остального. 13.02.2017
  • Большое спасибо! Я очень ценю :) Прочитаю как можно скорее 13.02.2017

  • 3

    У меня всегда были проблемы с RelativeLayouts и TextViews. Я думаю, что это связано с тем, что TextView вычисляет свой размер динамически, и это мешает ему хорошо работать с гравитацией макета. Это всего лишь одно из моих предположений. Решение, которое я обычно принимаю, - это настроить горизонтальный размер текстового представления с помощью match_parent. Это может быть неоптимальное решение, но оно должно работать. Если вам нужен TextView с фиксированным размером, вы можете установить размер фиксированного размера, и он тоже должен работать, это дает проблемы только с wrap_content.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:gravity="center_horizontal"
        tools:context="com.something">
    
        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:textAlignment="center"
            android:text="@string/app_title"
            android:layout_marginBottom="@dimen/main_spacing"
            android:textSize="24sp" />
    
    </RelativeLayout>
    

    Изменить: как было предложено @Valentino S., добавив

    android:layout_centerHorizontal="true"
    

    с wrap_content тоже должно работать. Причина в моей голове все та же: размер textView рассчитывается позже.

    09.02.2017
  • Эй, я ценю ваш ответ, но я также отредактировал свой код, так как урезанный код, который я добавил, действительно работал. Кажется, что гравитация кода нарушается, когда я добавляю autocompletetextview в качестве дочернего элемента к относительному макету. какие-нибудь мысли по этому поводу? 09.02.2017
  • LOL :) не совсем ... во всяком случае, оставьте это как альтернативу, если это не решение :) 09.02.2017

  • 4

    Как сказано в документации:

    android: гравитация

    Определяет, как объект должен позиционировать свое содержимое по осям X и Y в пределах его собственных границ.

    ...

    center_horizontal

    Поместите объект в центр контейнера по горизонтали, не меняя его размера.

    Таким образом, android:gravity="center_horizontal" будет центрировать RelativeLayout по горизонтали относительно своего родителя. Не делать его контент-центр горизонтальным.

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

    Имейте в виду, что поведение Layout может немного отличаться для каждого уровня API. И обратите внимание, что мы не можем на 100% быть уверенными в правильности визуального результата в редакторе макетов. Всегда проверяйте свой макет на реальных устройствах.

    09.02.2017
  • по вашей ссылке Указывает, как объект должен располагать свое содержимое по осям X и Y в пределах его собственных границ., я думаю, вы это неправильно прочитали :) 09.02.2017
  • Я правильно понял документацию. Кроме того, я тестировал на своем устройстве, и редактор макета, похоже, соответствует фактическому результату на моем устройстве в этом конкретном случае. 09.02.2017
  • @PierGiorgioMisley: какой-то текст под связанным текстом .. Якорь для него в документации не найден: P 09.02.2017
  • @ImpalaTamer: вам нужно протестировать его с новым уровнем API. У меня возникли некоторые аномалии с макетом при обновлении моей версии сборки sdk. 09.02.2017
  • не уверен на 100%, но я думаю, что текст о center_horizontal относится к общему значению этого ключевого слова. Полезной частью должно быть описание гравитации, но я могу потерпеть неудачу :) 09.02.2017
  • @ ישואוהבאותך Я тестирую последнюю версию API 25. 09.02.2017
  • @PierGiorgioMisley: Ну, ты прав. Цитируемый текст дайте неоднозначно. Я его обновил. 09.02.2017
  • @ImpalaTamer: Похоже, я неправильно понял ваш вопрос. Прошу прощения за это, здесь поздно ночью. Отвечая на ваш вопрос, вам нужно использовать android:layout_gravity="center_horizontal" для каждого представления или вы можете попробовать добавить еще один RelativeLayout внутри RelativeLayout с android:gravity="center_horizontal" 09.02.2017

  • 5

    попробуй это:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:background="#000000"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin">
    
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="10dp"
            android:background="#ffffffff"
            android:text="TITLE"
            android:textAlignment="center"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:textSize="24sp" />
    
        <AutoCompleteTextView
            android:id="@+id/enterContact"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/title"
            android:layout_marginBottom="10dp"
            android:background="#ffffffff"
            android:text="Enter Contact"
            android:textAlignment="center" />
    
    </RelativeLayout>
    

    введите описание изображения здесь

    09.02.2017
  • Вы только что изменили android: layout_width текстового представления на match_parent. Это не ответ на мой вопрос. 09.02.2017
  • see how in the last image the title is to the left заголовок теперь находится в центре макета .. так что твой вопрос? 09.02.2017
  • Поле, окружающее заголовок, является контуром текстового представления, оно должно быть в центре относительного макета. Извините, я понимаю, почему это сбивает с толку. 09.02.2017

  • 6

    TlDr: android: gravity Работает с RelativeLayout, вы можете перейти к концу, если не хотите читать объяснение.

    ИЗМЕНИТЬ, это огромная стена текста, пожалуйста, терпите меня

    Вот чего, я полагаю, вы хотите достичь:

    <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:textAlignment="center"
            android:text="@string/app_title"
            android:layout_marginBottom="@dimen/main_spacing"
            android:textSize="24sp"
            android:layout_centerHorizontal="true"/>  <!-- LAYOUT PARAMS WORK!!!-->
    

    Почему это работает, а android:gravity (очевидно) - нет?

    1. если ваша цель - разместить TextView в центре горизонтального макета / экрана, вы должны сообщить об этом RelativeLayout!

    2. это достигается с помощью того, что называется LayoutParams - это структуры данных, определенные каждым View, которые используются родителем View (в данном случае RelativeLayout)

    3. Итак, допустим, ваш TextView имеет следующее LayoutParams:

      android: layout_centerHorizontal = "true"

    вы получите что-то вроде этого:

    введите описание изображения здесь

    Когда RelativeLayout распределяет свои дочерние представления по экрану, по пути выполняется метод обратного вызова - onLayout (...) - который является частью более сложной последовательности методов, которая определить положение каждого дочернего View внутри RelativeLayout, это частично достигается за счет доступа к LayoutParams в каждом дочернем View, в данном случае к этой строке в вашем TextView

    1. Вот почему мы говорим, что LayoutParams передаются родителю, как в ссылке, которую вы упомянули ранее

    ВНИМАНИЕ: бесконечный источник путаницы!

    Позиционирование просмотра внутри Layouts / ViewGroups осуществляется с помощью LayoutParams onLayout вызовов

    Так получилось, что некоторые макеты, такие как FrameLayout, имеют LayoutParam с именем android: layout_gravity, что вызывает большую путаницу со свойством android:gravity, которое может определять каждое представление, которое НЕ то же самое и даже не LayoutParam

    android:gravity используется любым представлением (например, TextView) для размещения его содержимого внутри.

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

    <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="95dp"   <------------ very high!
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:textAlignment="center"
            android:text="@string/app_title"
            android:layout_marginBottom="@dimen/main_spacing"
            android:textSize="24sp"
            android:layout_centerHorizontal="true" <----- LayoutParams for RelativeLayout
            />
    

    TextView в центре, но текст вверху

    TextView в RelativeLayout находится В ЦЕНТРЕНИИ, но текст находится в ВЕРХНЕЕ «поле».

    Давайте воспользуемся android: gravity для управления положением текста ВНУТРИ TextView

    <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="95dp"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:textAlignment="center"
            android:text="@string/app_title"
            android:layout_marginBottom="@dimen/main_spacing"
            android:textSize="24sp"
            android:layout_centerHorizontal="true"
            android:gravity="bottom"       <---**NOT LayoutParams**, NOT passed to RLayout
            />
    

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

    введите описание изображения здесь

    TL; DR. Теперь, если вы хотите игнорировать все вышеперечисленное и по-прежнему использовать android: gravity с RelativeLayout, RelativeLayout также View, поэтому у него есть свойство android: gravity, но вам нужно удалить другие свойства или LayoutParams, которые переопределят поведение, определенное свойством android: gravity, посмотрите на android: gravity при работе с RelativeLayout

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:gravity="bottom">   <!-- NOT LAYOUT PARAMS -->
    
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="95dp"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:textAlignment="center"
            android:text="@string/app_title"
            android:layout_marginBottom="@dimen/main_spacing"
            android:textSize="24sp"
            android:layout_centerHorizontal="true"
            />
    
        <AutoCompleteTextView
            android:id="@+id/enterContact"
            android:text="Enter Contact"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAlignment="center"
            android:layout_below="@+id/title"
            android:layout_marginBottom="@dimen/main_spacing" />
    
    </RelativeLayout>
    

    введите описание изображения здесь

    09.02.2017
  • gravity не является LayoutParams, потому что gravity в относительном макете не предназначен для использования для передачи некоторой информации родительскому элементу относительного макета. Он предназначен для того, чтобы сообщить дочерним элементам относительного макета, как они должны быть выровнены внутри относительного макета. Вот почему атрибут gravity существует в этом Документация по относительному макету. gravity, примененный к макету кадра, работает прямо противоположно тому, как gravity применяется к относительному макету, и документация точно показывает это. 09.02.2017
  • @ImpalaTamer да, действительно, как я уже говорил, android: layout_gravity является LayoutParam и передается родительской ViewGroup в иерархии, android: gravity используется внутри самого View - не передается родительскому элементу, также здесь нет упоминания LayoutParams ;) 09.02.2017
  • да, в моем вопросе у меня проблемы с gravity, примененным к относительной компоновке. Есть мысли по поводу глюков? 09.02.2017
  • @ImpalaTamer Хорошо, у меня создалось впечатление, что вы решили проблему и пытаетесь понять причину, по которой это происходит, позвольте мне взглянуть на ваш xml и попытаться помочь после обеда 09.02.2017
  • ну, на самом деле у меня есть решение, с которым я могу двигаться дальше, но я действительно хотел бы знать, почему gravity не работает с относительными макетами, поэтому, если у вас есть какие-либо идеи по этому поводу, это было бы круто, и это ответ, который я считаю лучшим . 09.02.2017
  • @ImpalaTamer Я написал подробное объяснение с примерами, надеюсь, это поможет вам понять, взгляните на отредактированный ответ. Спойлер: android: гравитация работает с RelativeLayout, вам просто не следует использовать его, потому что у вас есть гораздо лучшие / универсальные инструменты с RelativeLayout LayoutParams. Ваше здоровье! 10.02.2017
  • @ImpalaTamer ты понял объяснение? 10.02.2017
  • Я понимаю ваше объяснение, но на самом деле оно не отвечает на мой вопрос о том, почему гравитация относительного макета не делает то, что я ожидал. Здесь есть ответ, который гласит, что от того, какой вид будет самым широким, будет зависеть расположение всего остального. Таким образом, гравитация в относительном макете, вероятно, полезна только в том случае, если все подпредставления имеют одинаковую ширину. Это то, что мне нужно было знать, чтобы прояснить мое замешательство. Я действительно ценю твои усилия. 13.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..