Android RelativeLayout выровнять центр из другого вида - PullRequest
25 голосов
/ 30 марта 2011

У меня есть RelativeLayout с двумя детьми, которые также RelativeLayout содержат несколько кнопок и вещей. Эти дочерние макеты не центрированы в моем основном макете, и основной макет содержит некоторые другие стороны по бокам этих двух. Я хочу, чтобы первый был поверх второго. Это достаточно просто, просто используйте android:layout_below="@+id/firstLayout" во втором. Но я также хочу, чтобы второй был выровнен по центру первого. Под этим я подразумеваю, что я хочу, чтобы второй макет нашел центр первого и выровнялся так, чтобы его центр находился в той же позиции x. Я вижу alignLeft, alignRight, alignTop, and alignBaseline, но нет центра. Можно ли обойтись без жесткого кодирования поля, чтобы сдвинуть второй макет поверх некоторого?

Вот грубый пример того, что я пытаюсь закончить, синяя полоса будет первым макетом, а красное поле будет вторым макетом. Я знаю, что мог бы обернуть их обоих в другой RelativeLayout, который имеет размеры, равные "wrap_content", а затем использовать centerHorizontal="true" для второго. Но я действительно предпочел бы оставить обоих в качестве дочерних элементов моего основного макета (мне пришлось бы внести некоторые изменения в работу определенных частей моего приложения, если бы я сделал их дочерними элементами для отдельного макета. Чего я стараюсь избегать.)

Example of what I want

Ответы [ 5 ]

9 голосов
/ 30 марта 2011

Если вы можете установить ширину родительского макета равным "wrap_content", вы можете поместить оба дочерних макета в центр

3 голосов
/ 20 июня 2017

Иногда вы можете установить alignLeft и alignRight на желаемый вид, а затем использовать гравитацию на элементе, который вы хотите центрировать.

Например:

android:layout_below="@+id/firstLayout"
android:layout_alignLeft="@+id/firstLayout"
android:layout_aligntRight="@+id/firstLayout"
android:gravity="center"

Если компонент не является TextView (или видом, в котором вам не нужен фон), вы можете обернуть его в FrameLayout с указанными выше свойствами.

<MyView id="@+id/firstLayout" .. other props/>

<FrameLayout 
    ... other props
    android:layout_below="@+id/firstLayout"
    android:layout_alignLeft="@+id/firstLayout"
    android:layout_aligntRight="@+id/firstLayout"
    android:gravity="center" >

    <MyView id="@+id/myAlignedView" ..other props />

</FrameLayout>

Таким образом, нижний вид будет фреймом той же ширины, что и верхний, но внутри него будет вид с центром в ширину.

Конечно, это работает только тогда, когда вы знаете, какое изображение больше. Если нет, то, как ответил Ларанджейру, оберните оба содержимого в другой макет с центрированной гравитацией.

1 голос
/ 24 августа 2015

Единственное решение, которое мне помогло, - это обернуть оба компонента в FrameLayout размером более крупного компонента и установить второй компонент в центре FrameLayout, используя свойство

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/red_component"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

    <View
        android:id="@+id/blue_component"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_gravity="center" />

</FrameLayout>
0 голосов
/ 02 ноября 2016

Для текстов я использовал этот f.e для выравнивания по центру по вертикали:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_alignTop="@id/theBigOne"
android:layout_alignBottom="@id/theBigOne"
android:layout_toRightOf="@id/theBigOne"
0 голосов
/ 13 февраля 2014

Просто установите так:

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


    <View
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/bottomHolder"
        android:layout_alignParentTop="true"
        android:layout_centerInParent = "true"/>

    <View
        android:id="@+id/bottomHolder"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>
...