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)
}
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)
}
You can use these parameters:
horizontalAlignment
= the horizontal gravity of the layout's children.verticalArrangement
= the vertical arrangement of the layout's childrenSomething 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 ( ) { ... }
You can use
Text(
text = item.title,
textAlign = TextAlign.Center,
modifier = Modifier.align(alignment = Alignment.CenterHorizontally)
)
You can find details in attachment by looking figures of all possibilities of aligning view inside column. Hope it helps you!
Use this
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
)
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
Alternatively you can create your own composable and use it everywhere:
@Composable
fun Center( modifier: Modifier = Modifier, content: @Composable ColumnScope.() -> Unit) {
Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
content = content
)
}
And you use like this:
Center {
Text(text = "Text 1")
Text(text = "Text 2")
}
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
You can use Arrangement.Center
SAMPLE CODE
@Composable
fun Column(
arrangement: Arrangement = Arrangement.Center,
)
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)
}
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
)
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))
}
}
In case if you are using lazyColumn to load list and want make whole item center you can use this
LazyColumn( horizontalAlignment = Alignment.CenterHorizontally) {
}
use
modifier = Modifier.align(Alignment.CenterHorizontally)
Update: This answer is outdated.
You can use Column(crossAxisAlignment = CrossAxisAlignment.Center)
. It works like gravity.
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)
}
}
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)
}
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)
}
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
){
// Child Composable Here Like Text, Row, Box, Image ... more
}
verticalArrangement
-> Make all Child Composable Center Vertically to Column(Parent)
horizontalAlignment
-> Make all Child Composable Center Horizontally to Column(Parent)