Skip to content
This repository was archived by the owner on Mar 27, 2022. It is now read-only.
This repository was archived by the owner on Mar 27, 2022. It is now read-only.

SegmentedButton in NestedScrollView not respecting wrap_content height #42

@addisonElliott

Description

@addisonElliott

Problem

When placing a SegmentedButtonGroup/SegmentedButton within a NestedScrollView, I am getting issues with the height not being set correctly even though the layout_height is set to wrap_content.

Here is an example layout, you should be able to see the issue in the layout inspector.

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

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fillViewport="true">

        <co.ceryle.segmentedbutton.SegmentedButtonGroup
            android:id="@+id/buttonGroup_pickupDropoffBoth"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:clipChildren="false"
            android:clipToPadding="false"
            android:duplicateParentState="false"
            android:fadeScrollbars="false"
            android:filterTouchesWhenObscured="false"
            android:fitsSystemWindows="false"
            android:focusableInTouchMode="false"
            android:hapticFeedbackEnabled="false"
            android:padding="0dp"
            app:sbg_backgroundColor="@color/white"
            app:sbg_position="0"
            app:sbg_radius="2dp"
            app:sbg_selectorColor="@color/colorPrimary87">

            <co.ceryle.segmentedbutton.SegmentedButton
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:isScrollContainer="false"
                android:padding="4dp"
                android:scrollbars="horizontal"
                app:sb_text="Both"
                app:sb_textColor="#000000"
                app:sb_textColor_onSelection="#FFFFFF" />

            <co.ceryle.segmentedbutton.SegmentedButton
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:padding="4dp"
                app:sb_text="Pickup"
                app:sb_textColor="#000000"
                app:sb_textColor_onSelection="#FFFFFF" />

            <co.ceryle.segmentedbutton.SegmentedButton
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:padding="4dp"
                app:sb_text="Dropoff"
                app:sb_textColor="#000000"
                app:sb_textColor_onSelection="#FFFFFF" />

        </co.ceryle.segmentedbutton.SegmentedButtonGroup>

    </androidx.core.widget.NestedScrollView>

</LinearLayout>

Here is a screenshot of what I see in the layout inspector:
Screenshot

See that sliver up top, yeah that is it being cut off! Commenting out NestedScrollView makes it work.

Solution

After some digging, I've found the culprit but I'm a bit confused by the source code so I need some assistance.

Regularly, the SegmentedButton will receive an onMeasure with an AT_MOST spec for the height. In this instance, it will return the following. See here for code

textHeight + 2 * paddingTop + 2 * paddingBottom

In a NestedScrollView, instead when sizing it does onMeasure with an UNSPECIFIED and SegmentedButton returns. See here for code

paddingTop + paddingBottom

Questions

@ceryle I am happy to submit a PR if we come to a conclusion for a fix.

Why does the AT_MOST return 2x padding for top/bottom while EXACTLY & UNSPECIFIED do not. This fixes the problem but I don't get the 2x so I was trying to understand.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions