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
(очевидно) - нет?
если ваша цель - разместить TextView в центре горизонтального макета / экрана, вы должны сообщить об этом RelativeLayout
!
это достигается с помощью того, что называется LayoutParams
- это структуры данных, определенные каждым View
, которые используются родителем View (в данном случае RelativeLayout)
Итак, допустим, ваш TextView
имеет следующее LayoutParams
:
android: layout_centerHorizontal = "true"
вы получите что-то вроде этого:
Когда RelativeLayout
распределяет свои дочерние представления по экрану, по пути выполняется метод обратного вызова - onLayout (...) - который является частью более сложной последовательности методов, которая определить положение каждого дочернего View внутри RelativeLayout, это частично достигается за счет доступа к LayoutParams
в каждом дочернем View
, в данном случае к этой строке в вашем TextView
- Вот почему мы говорим, что LayoutParams передаются родителю, как в ссылке, которую вы упомянули ранее
ВНИМАНИЕ: бесконечный источник путаницы!
Позиционирование просмотра внутри Layout
s / ViewGroup
s осуществляется с помощью LayoutParam
s 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 в 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