Центрировать несколько элементов в RelativeLayout, не помещая их в контейнер?

У меня есть RelativeLayout, содержащий пару кнопок рядом друг с другом, которые я хочу, чтобы быть в центре макета. Я мог бы просто поместить кнопки в LinearLayout и расположить их по центру в RelativeLayout, но я хочу, чтобы мой xml был максимально чистым.

Вот что я попробовал, это просто помещает кнопку "Применить" в центре и кнопку "Отменить" слева от него:

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="15sp">
  <TextView
    android:id="@+id/instructions"
    android:text="@string/instructions"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="15sp"
    android:layout_centerHorizontal="true"
    />
  <Button
    android:id="@+id/apply"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="@string/apply"
    android:textSize="20sp"
    android:layout_below="@id/instructions"
    />
  <Button
    android:id="@+id/undo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="@string/undo"
    android:textSize="20sp"
    android:layout_toLeftOf="@id/apply"
    android:layout_below="@id/instructions"
    />
</RelativeLayout>

5 ответов

Решение

android:gravity выровняйте содержимое внутри view или же layout это используется на.

android:layout_gravity выровняю view или же layout внутри его родителя.

Итак, добавление

android:gravity="center"

чтобы ваш RelativeLayout сделал свое дело...

Как это:

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:layout_marginTop="15sp">

</RelativeLayout>

Вот продолжение ответа BrainCrash. Это не вложенная опция, которая группирует и центрирует все три по горизонтали и вертикали. Кроме того, он берет верхний TextView и центрирует его горизонтально по обеим кнопкам. При желании вы можете затем центрировать текст в TextView с помощью android:gravity="center". Я также удалил поля, добавил цвет и установил высоту RelativeLayout равным fill_parent, чтобы выделить макет. Проверено на API 11.

<RelativeLayout
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:gravity="center"
  android:background="@android:color/black"
  >
  <TextView
    android:id="@+id/instructions"
    android:text="TEST"
    android:textSize="20sp"
    android:background="@android:color/darker_gray"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_alignLeft="@+id/undo"
    android:layout_alignRight="@+id/apply"
    android:gravity="center"
    />
  <Button
    android:id="@+id/apply"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="APPLY"
    android:textSize="20sp"
    android:layout_below="@id/instructions"
    />
  <Button
    android:id="@+id/undo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="UNDO"
    android:textSize="20sp"
    android:layout_toLeftOf="@id/apply"
    android:layout_below="@id/instructions"
    />
</RelativeLayout>
android:layout_gravity="center"

почти даст то, что вы ищете.

Вот комбинация приведенных выше ответов, которые разрешили мою конкретную ситуацию:

Центрирование двух отдельных меток в макете, который также включает кнопку в крайнем левом положении того же макета (кнопка, метка, метка, слева направо, где метки центрированы относительно макета, содержащего все три вида - то есть кнопка не сдвигает метки от центра).

Я решил эту проблему, вложив два RelativeLayout, где внешний макет включал в себя Button и Inner-RelativeLayout.

Inner-RelativeLayout содержал две текстовые метки (TextView's).

Вот фрагмент, который предоставляет детали того, как было выполнено центрирование и другие элементы макета:

см.: RelativeLayout Gravity не применяется? и Gravity и layout_gravity на Android для различия между гравитацией и layout_gravity.

Настройте paddingLeft на кнопку btn_button1, чтобы увидеть, что TextView не перемещаются.

(Приношу свои извинения, что у меня есть хз за отрицательные голоса. Я был слишком поспешен, думая, что просто б / у ваши предложения не решают точный вопрос, который задают, что они действительно помогают решать очень похожие ситуации (ответ здесь решает очень специфическую ситуацию и только комбинация всех этих ответов решила мою проблему. Я попытался проголосовать, но это не позволит мне, если я не отредактирую ответ, что я не хочу делать.)

<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/rl_outer"
  android:layout_width="fill_parent"
  android:layout_height="50dip"
  android:background="#FF0000FF">

  <Button
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/btn_button1"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:background="#FF00FF00"
    android:text="&lt;"
    android:textSize="20sp"
    android:paddingLeft="40dip"/>

  <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_inner"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:background="#FFFF00FF"        
    android:layout_centerInParent="true"
    android:gravity="center">      

    <TextView
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/tv_text1"
      android:layout_width="wrap_content"
      android:layout_height="fill_parent"
      android:background="#FF505050"
      android:textSize="20sp"
      android:textColor="#FFFFFFFF"
      android:text="Complaint #"
      android:gravity="center"/>     

    <TextView
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/tv_text2"
      android:layout_width="wrap_content"
      android:layout_height="fill_parent"
      android:background="#FF505050"
      android:textSize="20sp"
      android:textColor="#FFFFFFFF"
      android:layout_toRightOf="@id/tv_text1"
      android:gravity="center"/>

  </RelativeLayout>
</RelativeLayout>

LinearLayout хороший вариант Помимо этого есть такие опции, как создать невидимый вид и центрировать его, а затем выровнять левую кнопку по левому краю и справа от него. НО это просто обходные пути.

Другие вопросы по тегам