12

У меня есть два вида заголовков, HeaderViewA и HeaderViewB. Эти виды могут иметь любую комбинацию видимости visible или gone.Как разместить нижний из двух видов в ConstraintLayout?

мне нужно BigView быть расположены под низкий либо HeaderViewA/HeaderViewB.

Возможно ли это без гнездования в ConstraintLayout?

enter image description here

+0

Я хотел бы услышать другой ответ, но афайк это невозможно. – F43nd1r

+0

Интересно, но не представляется возможным только через XML. Вам не нужны вложенные представления, но если вы открыты для программирования , вы можете использовать [ConstraintSet] (https://developer.android.com/reference/android/support/constraint/ConstraintSet.html). – Cheticamp

+0

Почему гнездование ConstraintLayout является автоматическим выключателем? –

ответ

11

Теперь это возможно с классом Barrier, введенным в constraint-layout v1.1.0.

Так вот решение для вашего конкретного случая:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.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="com.example.eugene.test10.MainActivity"> 
    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:background="#EEEEEE" 
     android:text="TEXT_VIEW_1" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintRight_toLeftOf="@+id/textView2"/> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:background="#DDDDDD" 
     android:text="TEXT_VIEW_2" 
     android:visibility="gone" 
     app:layout_constraintLeft_toRightOf="@+id/textView1" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

    <android.support.constraint.Barrier 
     android:id="@+id/labelBarrier" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:barrierDirection="bottom" 
     app:constraint_referenced_ids="textView1,textView2" /> 

    <TextView 
     android:id="@+id/textView3" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:background="#CCCC00" 
     android:text="TEXT_VIEW_3" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/labelBarrier" /> 

</android.support.constraint.ConstraintLayout> 

результатов Here're для использования этого макета:

View on simulator

Вы можете передать этот шаг за шагом руководство по Codelab https://codelabs.developers.google.com/codelabs/constraint-layout/#10.

+1

Есть ли что-нибудь, что мне нужно для первого в моем проекте, чтобы реализовать барьеры? – Zerato

+2

@ Zerato вам нужно добавить '' com.android.support.constraint: constraint-layout: 1.1.0-beta3'' зависимость от файла gradle вашего модуля, а также добавить репозиторий maven в файл gradle проекта. Вы можете найти все зависимости в этом проекте GitHub https://github.com/googlecodelabs/constraint-layout –

0
<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.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"> 

    <TextView 
     android:id="@+id/header_view_a" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:background="@android:color/holo_orange_light" 
     android:gravity="center" 
     android:text="HeaderViewA " 
     android:layout_marginBottom="@dimen/sixteenDP" 
     android:textSize="30sp" 
     app:layout_constraintBottom_toTopOf="@+id/guideline" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="@+id/header_view_b" 
     app:layout_constraintEnd_toStartOf="@+id/header_view_b" 
     app:layout_constraintVertical_bias="0" 
     app:layout_constraintWidth_default="wrap" /> 

    <TextView 
     android:id="@+id/header_view_b" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:background="@android:color/holo_green_light" 
     android:gravity="center" 
     android:text="HeaderViewB" 
     android:textAlignment="center" 
     android:textSize="30sp" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintBottom_toTopOf="@id/guideline" 
     app:layout_constraintStart_toEndOf="@+id/header_view_a"/> 

    <android.support.constraint.Guideline 
     android:id="@+id/guideline" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintGuide_percent="0.4"/> 

    <TextView 
     android:id="@+id/big_view" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_marginBottom="8dp" 
     android:background="@android:color/holo_blue_dark" 
     android:gravity="center" 
     android:text="BigView" 
     android:textAlignment="center" 
     android:textSize="@dimen/list_item_height" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="@+id/guideline" 
     app:layout_constraintVertical_bias="1.0"/> 

</android.support.constraint.ConstraintLayout> 

Watch out для app:layout_constraintWidth_default="wrap"шириной набора для 0dp). Если установлено, виджет будет иметь тот же размер, что и при использовании wrap_content, но будет ограничен ограничениями (т. Е. Он не будет расширяться за их пределами) и app:layout_constraintVertical_bias="1.0". Используйте предубеждение, чтобы вытащить BigView на дно своего родителя.

Смежные вопросы