Ответ 1
Если вы можете установить ширину родительского макета на "wrap_content", вы можете поместить оба макета для детей в центр
У меня есть RelativeLayout
с двумя детьми, которые также являются RelativeLayout
содержащими несколько кнопок и вещей. Эти макеты детей не сосредоточены в моем основном макете, и основной макет содержит некоторые другие вещи с сторон этих двух. Я хочу, чтобы первый был поверх второго. Это достаточно просто, просто используйте android:layout_below="@+id/firstLayout"
во втором. Но я также хочу, чтобы второй был выровнен по центру первого. Под этим я подразумеваю, что я хочу, чтобы второй макет нашел центр первого и выровнялся так, чтобы его центр находился в одной и той же позиции. Я вижу alignLeft, alignRight, alignTop, and alignBaseline
, но не центр. Можно ли обойтись без необходимости жестко кодировать маржу, чтобы запустить второй макет над некоторыми?
Вот приблизительный пример того, что я пытаюсь закончить, синий план будет первым макетом, а красным полем будет второй макет. Я знаю, что я мог бы обернуть их оба в другой RelativeLayout
, размер которого равен "wrap_content"
а затем использовать centerHorizontal="true"
для второго. Но я действительно предпочел бы оставить их как детей моего основного макета (я должен был бы внести некоторые изменения в то, как некоторые части моего приложения работают, если я делаю их детьми из отдельного макета, чего я стараюсь избегать).
Если вы можете установить ширину родительского макета на "wrap_content", вы можете поместить оба макета для детей в центр
Иногда вы можете установить 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>
Таким образом, снизу будет рама с той же шириной, что и верхняя, но внутри нее будет вид, который будет центрирован по ширине.
Конечно, это работает только тогда, когда вы знаете, какой из них больше. Если нет, как ответил Ларанджейро, оберните оба содержимого в другой макет с центрированной гравитацией.
Единственное решение, которое сработало для меня, - это обернуть оба компонента в 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>
Для текстов я использовал этот 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"
Просто установите следующее:
<?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>