Как разбить макет на четыре равных части в Android? - PullRequest
1 голос
/ 22 октября 2019

Я пытался этот ответ .

Но я получаю Nested weights are bad for performance. Есть ли способ решить эту проблему или я должен продолжить это предупреждение?

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

Вот схема, необходимая для решения этой проблемы с помощью 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"
    tools:context=".MainActivity">

    <View
        android:id="@+id/one"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#333"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/two"
        app:layout_constraintBottom_toTopOf="@id/three"/>

    <View
        android:id="@+id/two"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#444"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toEndOf="@id/one"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toTopOf="@id/four"/>

    <View
        android:id="@+id/three"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#555"
        app:layout_constraintTop_toBottomOf="@id/one"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/four"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <View
        android:id="@+id/four"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#666"
        app:layout_constraintTop_toBottomOf="@id/two"
        app:layout_constraintStart_toEndOf="@id/three"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Однако это предупреждение о производительности можно игнорировать. Вложенные веса являются плохими для производительности, но это будет заметно только тогда, когда у вас много вложенных весов во многих представлениях, которые часто обновляются (например, если RecyclerView отбрасывает, когда каждый элемент использует вложенные веса).

1 голос
/ 22 октября 2019

Вы можете попробовать эту связку кода XML ниже: (я проверял это без предупреждения ...)

Вот основной контент xml файл, тест. xml :

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

<include
    layout="@layout/test_1"
    android:layout_width="match_parent"
    android:layout_weight="1"
    android:layout_height="0dp"/>

<include
    layout="@layout/test_2"
    android:layout_width="match_parent"
    android:layout_weight="1"
    android:layout_height="0dp"/>

</LinearLayout>

Поскольку я использовал один и тот же код xml для двух вложенных файлов test_1.xml и test_2.xml ;Я делюсь общим кодом ниже:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:weightSum="2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"/>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:background="@android:color/holo_purple"/>

</LinearLayout>

И угадайте, что я нашел отзывчивый макет, который вы хотите достичь. Вот вывод:

output

Дайте мне знать, если это работает и для вас. Удачного кодирования.

0 голосов
/ 22 октября 2019

Вы можете использовать ConstraintLayout с инструкциями. Например, если вы хотите, чтобы макет был разделен на 4 равные части по горизонтали, вы должны использовать 3 вертикальных направляющих, один из которых установлен на 0,25, один - на 0,50, а другой - на 0,75. Если вы хотите, чтобы он был разбит по вертикали, вы бы использовали те же проценты указателей, но с горизонтальными указателями.

Затем вы поместили бы ваши представления с ограничениями на указатели и родительский элемент.

...