Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to position below the lowest of two views in ConstraintLayout?

I have two header views, HeaderViewA and HeaderViewB. These views can have any combination of visibility visible or gone.

I need BigView to be positioned under the lowest of either HeaderViewA/HeaderViewB.

Is this possible without nesting in ConstraintLayout?

enter image description here

like image 295
ZakTaccardi Avatar asked Feb 21 '17 01:02

ZakTaccardi


People also ask

How do you constraint a view?

To convert an existing layout to a constraint layout, follow these steps: Open your layout in Android Studio and click the Design tab at the bottom of the editor window. In the Component Tree window, right-click the layout and click Convert layout to ConstraintLayout.

Is ConstraintLayout better than RelativeLayout?

ConstraintLayout has flat view hierarchy unlike other layouts, so does a better performance than relative layout. Yes, this is the biggest advantage of Constraint Layout, the only single layout can handle your UI. Where in the Relative layout you needed multiple nested layouts (LinearLayout + RelativeLayout).

Is ConstraintLayout faster than LinearLayout?

Results show that the fastest layout is Relative Layout, but difference between this and Linear Layout is really small, what we can't say about Constraint Layout. More complex layout but results are the same, flat Constraint Layout is slower than nested Linear Layout.

How do you set a barrier in constraint layout?

To define a Barrier , you can select one or more View components from the “Design” view, open the “Guidelines” menu and select the Barrier . If you want to add it directly in the XML, you can use the following code snippet: The resulting layout looks like the screenshot of the “Design” layout editor view from below.


2 Answers

Now it's possible with Barrier class, introduced in constraint-layout v1.1.0.

So here's the solution for your particular case:

<?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 results for using this layout:

View on simulator

You can refer this step-by-step guide on Codelab https://codelabs.developers.google.com/codelabs/constraint-layout/#10.

like image 75
Eugene Brusov Avatar answered Oct 17 '22 04:10

Eugene Brusov


<?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 for app:layout_constraintWidth_default="wrap" (with width set to 0dp). If set, the widget will have the same size as if using wrap_content, but will be limited by constraints (i.e. it won't expand beyond them) and app:layout_constraintVertical_bias="1.0". Use bias to pull BigView to the bottom of its parent.

like image 26
Johnny Avatar answered Oct 17 '22 03:10

Johnny