У меня есть собственное представление, которое расширяет класс вида. Я бы хотел, чтобы два экземпляра моего пользовательского представления накладывались друг на друга непосредственно друг над другом. Как должен выглядеть файл макета для этого?
Как просмотреть слои
Ответ 1
Оказывается, FrameLayout был тем, что я хотел. Просто сделайте это в своем макете:
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<com.proj.MyView
android:id="@+id/board1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<com.proj.MyView
android:id="@+id/board2"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</FrameLayout>
Ответ 2
Используйте RelativeLayout
. Позже дети RelativeLayout
будут перекрывать ранние дети.
Ответ 3
Хотя верно, что вы можете достичь слоев с использованием RelativeLayout
и FrameLayout
, в API 21 и выше.. все изменилось.
В API 21 и выше более поздние дети из xml не означают, что они перекрывают ранние дети. Вместо этого он использует Elevation
, чтобы определить, какой вид будет перекрывать другой вид (Z-Index).
Например, если у вас есть что-то вроде этого.
<FrameLayout
android:layout_height="match_parent"
android:layout_width="match_parent">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:text="Hello World"
android:layout_gravity="top" />
<View
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@android:color/black"
android:layout_gravity="bottom" />
</FrameLayout>
View
не будет отображаться, даже если он был добавлен после Button
. Это потому, что Button
имеет более высокую высоту, чем View
. Чтобы изменить Z-Index, вы можете добавить атрибут Elevation
к соответствующим представлениям.
<FrameLayout
android:layout_height="match_parent"
android:layout_width="match_parent">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:text="Hello World"
android:layout_gravity="top"
android:elevation="0dp" />
<View
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="@android:color/black"
android:layout_gravity="bottom"
android:elevation="2dp" />
</FrameLayout>
Таким образом, View
будет перекрывать Button
.
Дополнительная информация о Высота и тени: https://material.io/guidelines/material-design/elevation-shadows.html