#android #android-layout
Вопрос:
Для моего текущего приложения для Android требуется сложная компоновка следующим образом.
это завершенный вид
------------------------------------------------------------------------------------------
| |
| --------------- ------------------------------------------------- --------------- |
| | | | | | | |
| | | | | | | |
| | IV(1) | | TV(1) | | IV(2) | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| --------------- ------------------------------------------------- --------------- |
| --------------------------------------------------------------------------------- |
| | | |
| | | |
| | | |
| | TV(2) | |
| | | |
| | | |
| --------------------------------------------------------------------------------- |
| --------------- ------------------------------------------------- --------------- |
| | | | | | | |
| | | | | | | |
| | IV(3) | | TV(3) | | IV(4) | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| --------------- ------------------------------------------------- --------------- |
------------------------------------------------------------------------------------------
Он состоит из четырех ImageView
s (например IV1
, — 4
) и трех TextView
s (например TV1
, — 3
)
Существуют дополнительные ограничения, которых я должен придерживаться
- Всегда будет присутствовать минимум 1 ImageView, это может быть любой из четырех показанных
- Все текстовые представления являются обязательными
- Все просмотры изображений имеют одинаковую ширину и высоту
- Все высоты Textviews должны соответствовать высоте ImageViews
Для верхней и средней строк, показанных выше, мне удалось перейти к следующему макету
<RelativeLayout
android:id="@ id/top_row_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="10dp"
android:paddingTop="10dp"
android:paddingEnd="10dp">
<ImageView
android:id="@ id/top_left_corner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher_background" />
<TextView
android:id="@ id/top_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@ id/top_left_corner"
android:layout_alignWithParentIfMissing="true"
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:layout_toStartOf="@ id/top_right_corner"
android:layout_toEndOf="@ id/top_left_corner"
android:text="@string/lorem_ipsum" />
<ImageView
android:id="@ id/top_right_corner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:src="@drawable/ic_launcher_background" />
</RelativeLayout>
<TextView
android:id="@ id/middle_text"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:text="@string/lorem_ipsum" />
Я хотел добиться желаемого пользовательского интерфейса без необходимости разработки пользовательского представления, но у меня такое чувство, что это может быть единственным решением.
Комментарии:
1. Я рекомендую вам изучить
ConstraintLayout
и использовать горизонтальное и вертикальное смещение в дочерних представлениях, возможно, именно так вы сможете этого добиться.2. @Gourav я не большой поклонник ConstraintLayout, однако я попробую
3. Даже я не был фанатом, пока не узнал об этом. Это может быть полезно во многих сценариях. Стоит изучить 🙂
Ответ №1:
Вы можете добиться этого макета с помощью ConstraintLayout
Попробуйте приведенный ниже код:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"
android:padding="20dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@ id/clMain1"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:padding="10dp">
<ImageView
android:id="@ id/ivMain1"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintDimensionRatio="1:1"
android:src="@mipmap/ic_launcher"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@ id/ivMain1"
app:layout_constraintEnd_toStartOf="@id/ivMain2"
app:layout_constraintTop_toTopOf="@ id/ivMain1"
app:layout_constraintBottom_toBottomOf="@ id/ivMain1"
android:text="Text1"
android:gravity="center"/>
<ImageView
android:id="@ id/ivMain2"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintDimensionRatio="1:1"
android:src="@mipmap/ic_launcher"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@ id/clMain1"
app:layout_constraintBottom_toTopOf="@ id/clMain2"
android:gravity="center"
android:text="Text2"
android:padding="10dp"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@ id/clMain2"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:padding="10dp">
<ImageView
android:id="@ id/ivMain3"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintDimensionRatio="1:1"
android:src="@mipmap/ic_launcher"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@ id/ivMain3"
app:layout_constraintEnd_toStartOf="@id/ivMain4"
app:layout_constraintTop_toTopOf="@ id/ivMain3"
app:layout_constraintBottom_toBottomOf="@ id/ivMain3"
android:text="Text3"
android:gravity="center"/>
<ImageView
android:id="@ id/ivMain4"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintDimensionRatio="1:1"
android:src="@mipmap/ic_launcher"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Для получения дополнительной информации ContraintLayout
проверьте эту официальную ссылку
Вывод для приведенного выше кода
Комментарии:
1. Вы ускорили мое изучение ограничений, я прихожу к мысли, что компоновка ограничений не так уж плоха.
Ответ №2:
Вы можете узнать о ConstraintLayout
или TableLayout
, эти два варианта могут решить вашу проблему.