Constraint layout guideline percentage screen sizes not working

Viewed 966

I have a layout which has a hierarchy of component tree-like

Main Constraint Layout> Child ImageView Child Nested Constraint layout > Constraint layout

The image is constrained to 20% on top and 50 % on the bottom, While the nested layout is constrained to 30%.

My logic was the difference in bottom constrained of the image - nested Layout view constrained that is

50-30 = 20%

So if I put My TextView in nested layout with 20% constrained > The TextView in Constraint layout of NestedScrollView should fit right below the image view of parent constraint layout.

But when I tested this logic in Mobile with 4", 5" and 6" the constraint guideline percentage seems off and white space comes on top of TextView.

4"Mobile | 5"Mobile | 6"Mobile

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/gradient_bck"
    android:clickable="true"
    android:focusable="true">

    <View
        android:id="@+id/layout_show_all_gradient_bck"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@drawable/bck_primary_gradient"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="@+id/img_top"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.google.android.material.imageview.ShapeableImageView
        android:id="@+id/img_top"
        style="@style/CornerShape10"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:elevation="1dp"
        android:scaleType="centerCrop"
        app:layout_constraintBottom_toTopOf="@+id/guideline22"
        app:layout_constraintEnd_toStartOf="@+id/guideline26"
        app:layout_constraintStart_toStartOf="@+id/guideline25"
        app:layout_constraintTop_toTopOf="@+id/guideline9"
        app:layout_constraintVertical_bias="1.0"
        app:srcCompat="@drawable/test_img" />

    <androidx.core.widget.NestedScrollView
        android:id="@+id/layout_nested"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="@drawable/bck_cat_details_view"
        android:fillViewport="true"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline24"
        app:layout_constraintVertical_bias="0.0">


        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_details"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                app:layout_constraintEnd_toStartOf="@+id/guideline30"
                app:layout_constraintStart_toStartOf="@+id/guideline29"
                app:layout_constraintTop_toTopOf="@+id/guideline28"
                 />

            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/tv_facts"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/txt_facts"
                app:layout_constraintStart_toStartOf="@+id/guideline29"
                app:layout_constraintTop_toBottomOf="@+id/tv_test_details"
                app:textAllCaps="true" />


            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/tv_msg_facts"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                app:layout_constraintEnd_toStartOf="@+id/guideline30"
                app:layout_constraintStart_toStartOf="@+id/guideline29"
                app:layout_constraintTop_toBottomOf="@+id/tv_facts"
              />

            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TITLE"
                app:layout_constraintStart_toStartOf="@+id/guideline29"
                app:layout_constraintTop_toBottomOf="@+id/tv_msg_facts"
                app:textAllCaps="true" />


            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/tv_msg_title"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                app:layout_constraintEnd_toStartOf="@+id/guideline30"
                app:layout_constraintStart_toStartOf="@+id/guideline29"
                app:layout_constraintTop_toBottomOf="@+id/tv_title"
                />
            <Space
                android:id="@+id/space_bottom_extra"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                app:layout_constraintTop_toBottomOf="@+id/tv_msg_title" />

            <androidx.constraintlayout.widget.Guideline
                android:id="@+id/guideline29"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                app:layout_constraintGuide_percent="0.10" />

            <androidx.constraintlayout.widget.Guideline
                android:id="@+id/guideline30"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                app:layout_constraintGuide_percent="0.90" />

            <androidx.constraintlayout.widget.Guideline
                android:id="@+id/guideline31"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                app:layout_constraintGuide_percent="0.73" />

            <androidx.constraintlayout.widget.Guideline
                android:id="@+id/guideline28"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                app:layout_constraintGuide_percent="0.20" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.core.widget.NestedScrollView>

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.20"
        app:layout_constraintTop_toTopOf="parent" />

  

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline23"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.05" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline24"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.35" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline22"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline25"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.1" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline26"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.9" />

      <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline27"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.10" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline32"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.92" />

</androidx.constraintlayout.widget.ConstraintLayout>
1 Answers

As you may have already figured, the layout inside a NestedScrollView expands its height as much as it fits its content despite the layout_height="match_patrent" attribute you defined. Knowing that you should find a replacement senario to build your layout inside NestedScrollView such as using absolute dimension values instead of percentage.

Related