Jetpack Compose - Column - Gravity center
AndroidKotlinAndroid JetpackAndroid Jetpack-ComposeAndroid Problem Overview
I'm creating a layout with Jetpack Compose and there is a column. I would like center items inside this column:
Column(modifier = ExpandedWidth) {
Text(text = item.title)
Text(text = item.description)
}
Android Solutions
Solution 1 - Android
You can use these parameters:
horizontalAlignment
= the horizontal gravity of the layout's children.verticalArrangement
= the vertical arrangement of the layout's children
Something like:
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "First item",
modifier = Modifier.padding(16.dp)
)
Text(
text = "Second item",
modifier = Modifier.padding(16.dp)
)
Text(
text = "Third item",
modifier = Modifier.padding(16.dp)
)
}
If you want only to center horizontally just use:
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Column ( ) { ... }
Solution 2 - Android
You can use
Text(
text = item.title,
textAlign = TextAlign.Center,
modifier = Modifier.align(alignment = Alignment.CenterHorizontally)
)
- textAlign is for aligning text inside the box.
- Modifier.align() is for aligning text box inside column
Solution 3 - Android
Use this
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
)
Solution 4 - Android
You have the option to apply gravity on the individual items as follows then it will center the items.
Column(modifier = ExpandedWidth) {
Text(modifier = Gravity.Center, text = item.title)
Text(modifier = Gravity.Center, text = item.description)
}
Solution 5 - Android
I don't like it too much, but this is what it worked to me:
Column(modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center) {
//Your composable elements
}
Compose 1.0.0-beta07
Solution 6 - Android
Text(
"Hello World",
textAlign = TextAlign.Center,
modifier = Modifier.width(150.dp)
)
You can use TextAlign
attribute to center the texts.
Reference - https://developer.android.com/jetpack/compose/text
Solution 7 - Android
You can use Column(crossAxisAlignment = CrossAxisAlignment.Center)
. It works like gravity.
Solution 8 - Android
You can use Arrangement.Center
- Place child components as close to the center of the main axis
SAMPLE CODE
@Composable
fun Column(
arrangement: Arrangement = Arrangement.Center,
)
Solution 9 - Android
In case if you are using lazyColumn to load list and want make whole item center you can use this
LazyColumn( horizontalAlignment = Alignment.CenterHorizontally) {
}
Solution 10 - Android
if you are using 0.1.0-dev09
you can modify the gravity or arrangement attributes by using the parameters horizontalAlignment
and verticalArrangement
@Composable
fun centeredColumn() {
return Column (
modifier = Modifier.height(100.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Image(asset = imageResource(id = R.drawable.ic_emojo_logo_white))
Text(text = stringResource(id = R.string.login_subtitle))
}
}
Solution 11 - Android
You can also use textAlign
property of Text
composable
Text(
modifier = Modifier.fillMaxWidth(),
text = item.title,
textAlign = TextAlign.Center
)
Text(
modifier = Modifier.fillMaxWidth(),
text = item.description,
textAlign = TextAlign.Center
)
Solution 12 - Android
You could use FlexColumn to bring content in the center as it supports CrossAxisAlignment.
FlexColumn(crossAxisAlignment = CrossAxisAlignment.Center) {
inflexible {
Text(text = item.title)
Text(text = item.description)
}
}
Warp it inside inflexible so that widgets will not occupy the full screen.
In the same way if you want to bring views to the center of the screen with FlexColumn than use mainAxisAlignment along with crossAxisAlignment
FlexColumn(mainAxisAlignment = MainAxisAlignment.Center,
crossAxisAlignment = CrossAxisAlignment.Center) {
inflexible {
Text(text = item.title)
Text(text = item.description)
}
}
Solution 13 - Android
This is how you do it as of the latest version of compose(0.1.0-dev05)
For you to center the text inside this container, you need to use the LayoutAlign
modifier.
Column(modifier = LayoutWidth.Fill + LayoutAlign.Center) {
Text(text = item.title)
Text(text = item.description)
}
Solution 14 - Android
To center horizontally
Column(modifier = Modifier.fillMaxWidth()) {
Text(text = item.title)
Text(text = item.description)
}
To center both horizontally and vertically in the parent surface
Column(modifier = Modifier.fillMaxWidth().fillMaxHeight(), verticalArrangement = Arrangement.Center) {
Text(text = item.title)
Text(text = item.description)
}
Solution 15 - Android
use
modifier = Modifier.align(Alignment.CenterHorizontally)