burkinafaso3741
burkinafaso3741

Reputation: 1330

How to align row elements by the baseline in Jetpack Compose

How to align elements inside a Row by the baseline. My issue is that I want to have a Row element with multiple Text elements and each of the Text elements will have different font and size. By default, they are aligned on the top. I need them to be aligned on the bottom. This is the code:

class MainActivity : ComponentActivity()  {
    override fun onCreate(savedInstanceState: Bundle?)  {
        super.onCreate(savedInstanceState)

        setContent {
            MaterialTheme {
                Row {
                    Text(
                        text = "Abrakadabra",
                        style = TextStyle(fontSize = 22.sp, fontWeight = FontWeight.Bold)
                    )
                    Text(
                        text = "Abrakadabra",
                        style = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.Bold)
                    )
                }
            }
        }
    }
}

Here is the rendered view of the code:

enter image description here

Upvotes: 47

Views: 27630

Answers (4)

D. Kupra
D. Kupra

Reputation: 373

I'm not at all proud of this; I'm just reporting. The answers listed on stackoverflow ( use Modifier.alignBy(LastBaseline), wrap Text() inside of a Box() and use Modifier.align(Alignment.BottomStart)) didn't work for me. Probably because I'm using an onTextLayout callback.

Until I can find something way less hacky, this will get me what I want.

@Composable
fun ForceTextToBottom(){
    val density=LocalDensity.current
    var offset by remember{mutableStateOf(0.dp)}
    var aHeightThatIAlreadyKnowInAdvance=100.dp
    Column{
           //some stuff before the stubborn Text()
        Row{//the parent of the stubborn Text()
            Image{//the sibling of the stubborn Text()
            Text(sentence, //This is the stubborn Text()
                ...
                ...
                modifier=Modifier
                    .height(aHeightThatIAlreadyKnowInAdvance)
                    .offset(y=offset)
                ...
                ...
                onTextLayout={textLayoutResult->
                    //Some layout size correction logic
                    offset=with(density){100.dp-textLayoutResult.getLineBottom(textLayoutResult.lineCount-1).toDp()}
                    }
                )
            }               
        }
    }
}

Not anything I'm happy about. But it gets the text to align to the bottom.

Upvotes: 1

RickSanchez725
RickSanchez725

Reputation: 329

UPDATE: This is no longer valid. Check @iknow's answer instead.

Currently, using Jetpack Compose 1.0.0-alpha03, you can achieve that with:

Text(modifier = Modifier.alignWithSiblings(FirstBaseline), ...)

Upvotes: 0

iknow
iknow

Reputation: 9852

In Jetpack Compose 1.0.0 it can be done in this way:

Row {
    Text(
        text = "One",
        fontSize = 20.sp,
        modifier = Modifier.alignByBaseline()
    )

    Text(
        text = "Two",
        fontSize = 12.sp,
        modifier = Modifier.alignByBaseline()
    )
}

Result:

enter image description here


If someone wants to align text to the last baseline when using multiline Text it can be done by using Modifier.alignBy(LastBaseline)

Row {
    Text(
        text = "Line 1\nLine 2",
        fontSize = 20.sp,
        modifier = Modifier.alignBy(LastBaseline)
    )

    Text(
        text = "Line 3",
        fontSize = 12.sp,
        modifier = Modifier.alignBy(LastBaseline)
    )
}

enter image description here

Upvotes: 92

Vinay Gaba
Vinay Gaba

Reputation: 1214

Add the following modifier to both the Text composables and that should take care of it. Here is the code for your reference

Text(...,  modifier = LayoutGravity.RelativeToSiblings(alignmentLine = FirstBaseline))
Text(...,  modifier = LayoutGravity.RelativeToSiblings(alignmentLine = FirstBaseline))

Screenshot enter image description here

Upvotes: 0

Related Questions