Reputation: 1330
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:
Upvotes: 47
Views: 27630
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
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
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:
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)
)
}
Upvotes: 92
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))
Upvotes: 0