Skip to content

Instantly share code, notes, and snippets.

@petitJAM
Last active March 24, 2021 08:04
Show Gist options
  • Save petitJAM/040782f19e18f9feca4c28f0df6ed19f to your computer and use it in GitHub Desktop.
Save petitJAM/040782f19e18f9feca4c28f0df6ed19f to your computer and use it in GitHub Desktop.
Ellipsize TextView with 0dp in ConstraintLayout
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:ellipsize="end"
android:maxLines="4"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- layout_constrainedWidth="true" is key -->
@petitJAM
Copy link
Author

@andor201995 I think this is the view I was working with most recently:

<TextView
    android:id="@+id/searchResultsExplainer"
    style="?attr/textAppearanceBody1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginHorizontal="16dp"
    android:ellipsize="end"
    android:maxLines="4"
    app:layout_constraintBottom_toTopOf="@id/topBarrier"
    app:layout_constraintEnd_toStartOf="@id/viewTypeToggle"
    app:layout_constraintStart_toEndOf="@id/openFilters"
    app:layout_constraintTop_toBottomOf="@id/searchInputLayout"
    app:layout_constraintVertical_bias="0.5"
    tools:text="Search results: &quot;Dining Room&quot;"
    tools:visibility="visible" />

Idk if that helps you at all.

Another thing you can try doing is ellipsizing the text manually. Something like:

val text = "Whatever really long string you are setting"

someTextView.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
    someTextView.text = TextUtils.ellipsize(
        text,
        someTextView.paint,
        someTextView.width.toFloat(),
        TextUtils.TruncateAt.MIDDLE // Or END, etc
    )
}

You need to do the change in an OnLayoutChangeListener because your view might not be laid out yet when you are calling this code to set the text. The TextUtils.ellipsize method needs to know the width of the view the text is going into in order to ellipsize it properly.

@andor201995
Copy link

Your solution was really helpful in guiding my usecase and used below code

private fun setSubTitle(text: String?) {
        // set the layout with expected max width for text
        contentText.isSingleLine = true
        contentText.text = text
        // reset the text with ellipsized text
        contentText.doOnNextLayout {
            if (it is TextView) {
                it.text = TextUtils.ellipsize(
                    text,
                    it.paint,
                    it.width.toFloat(),
                    TextUtils.TruncateAt.END
                )
            }
        }
    }

Thanks a lot.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment