Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show ellipsis (three dots) at the end of a Text line in Android Jetpack Compose?

Whether I use androidx.compose.foundation.text.BasicText or androidx.compose.material.Text, if there isn't enough space for a text it wraps to the next line, for example:

@Composable
fun EllipsisExample() {
    Box(modifier = Modifier.width(160.dp)) {
        Text("Lorem ipsum dolor sit amet.")
    }
}

renders:

enter image description here

How could I force it to be a single line and draw ellipsis at the end of it? The result I want in this case is something like:

Lorem ipsum dolor s…

like image 778
Valeriy Katkov Avatar asked Jan 15 '21 12:01

Valeriy Katkov


2 Answers

Both BasicText and Text have overflow and maxLines arguments which can help you.

Text(myText, maxLines = 1, overflow = TextOverflow.Ellipsis)

Here's a full single-line example:

import androidx.compose.material.Text
import androidx.compose.ui.text.style.TextOverflow

@Composable
fun EllipsisExample() {
    Box(modifier = Modifier.width(160.dp)) {
        Text(
            text = "Lorem ipsum dolor sit amet.",
            maxLines = 1,
            overflow = TextOverflow.Ellipsis
        )
    }
}

enter image description here

Of course you can tune maxLines to fit your needs:

Text(
    text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
    maxLines = 2,
    overflow = TextOverflow.Ellipsis
)

enter image description here

like image 176
Valeriy Katkov Avatar answered Oct 10 '22 12:10

Valeriy Katkov


You can set the overflow attribute in Text composable to TextOverflow.Ellipsis Ex:

Text(
    text = "Compose Previews are great to check quickly how a composable layout looks like",
    maxLines = 2,
    overflow = TextOverflow.Ellipsis
)

If you want to make the ellipsis dynamic you should use Compose's state APIs like remember and mutableStateOf, so any changes to state automatically update the UI

@Composable
fun MessageCard(msg: String) {
var isExpanded by remember { mutableStateOf(false) }
Text(
     text = msg,
     modifier = Modifier.padding(all = 4.dp),
     style = MaterialTheme.typography.body2,
     maxLines = if (isExpanded) Int.MAX_VALUE else 1,
     overflow = if (isExpanded) TextOverflow.Visible else TextOverflow.Ellipsis
    )
}
like image 19
MohamedHarmoush Avatar answered Oct 10 '22 11:10

MohamedHarmoush