Row è una funzione composable in Jetpack Compose per posizionare elementi figli in una riga orizzontale. A differenza di Column, Row dispone gli elementi da sinistra a destra e supporta la configurazione del layout tramite i parametri horizontalArrangement e verticalAlignment. Secondo Google Android Documentation, 2025, Row è uno dei tre contenitori di base di Compose insieme a Column e Box e viene utilizzato per creare strutture di interfaccia orizzontali: righe di pulsanti, campi di input e icone con testo.
Punti chiave
Row è una funzione composable che posiziona gli elementi figli in una sequenza orizzontale. Nella gerarchia dei layout di Compose, Row occupa la posizione di un contenitore di base insieme a Column e Box.
Row non richiede la specifica delle dimensioni — si adatta automaticamente al suo contenuto. La larghezza di Row è uguale alla somma delle larghezze degli elementi figli inclusa la spaziatura, a meno che non venga specificato Modifier.fillMaxWidth o una dimensione fissa.
Gli elementi figli di Row possono avere i propri modificatori che influenzano la loro posizione all'interno del contenitore. Ad esempio, Modifier.weight consente agli elementi di occupare una parte proporzionale dello spazio disponibile.
Secondo Android Developers Blog, 2024, Row elabora gli elementi figli in sequenza, calcolando le loro dimensioni in base alle regole di misurazione di Compose: prima vengono misurati gli elementi senza weight, poi lo spazio rimanente viene distribuito tra gli elementi con weight.
La firma di base di Row include il parametro modifier, horizontalArrangement e verticalAlignment. Tutti gli elementi figli vengono passati nel blocco lambda del contenuto finale.
@Composable
fun RowExample() {
Row(
modifier = Modifier.fillMaxWidth().padding(16.dp),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
Text(text = "Uno")
Text(text = "Due")
Text(text = "Tre")
}
}
Il parametro horizontalArrangement determina come gli elementi figli vengono distribuiti lungo l'asse orizzontale all'interno di Row. I valori disponibili includono Start, End, Center, SpaceBetween, SpaceAround e SpaceEvenly della classe Arrangement.
Arrangement.Start posiziona gli elementi all'inizio del contenitore, Arrangement.End — alla fine, e Arrangement.Center — al centro. Questi valori funzionano in modo simile alla proprietà justify-content in CSS Flexbox.
Arrangement.SpaceBetween distribuisce gli elementi uniformemente, posizionando il primo elemento all'inizio, l'ultimo alla fine e gli altri con spaziatura uguale tra loro. Secondo Material Design Guidelines, 2025, SpaceBetween è ottimale per barre degli strumenti e righe di navigazione.
Il parametro verticalAlignment allinea gli elementi verticalmente. I valori disponibili includono Alignment.Top, Alignment.CenterVertically e Alignment.Bottom. Questa proprietà è utile quando gli elementi di Row hanno altezze diverse — ad esempio, un'icona accanto a testo su più righe.
| Valore | Descrizione | Utilizzo |
|---|---|---|
| Start | Gli elementi sono spinti all'inizio di Row | Righe allineate a sinistra |
| Center | Gli elementi sono centrati nel contenitore | Menu orizzontali, intestazioni |
| SpaceBetween | Uniformemente con primo all'inizio e ultimo alla fine | Barre degli strumenti, navigazione |
| SpaceEvenly | Spaziatura uguale tra elementi e ai bordi | Righe di pulsanti, griglie uniformi |
| SpaceAround | Spaziatura uguale tra elementi, mezza spaziatura ai bordi | Caroselli, gallerie di icone |
Modifier.weight è un modificatore disponibile solo all'interno di Row e Column che distribuisce lo spazio disponibile tra gli elementi figli proporzionalmente al valore specificato. Se un elemento ha un peso di 1.0f e un altro di 2.0f, il secondo elemento occuperà il doppio dello spazio.
Gli elementi senza weight occupano lo spazio necessario per il loro contenuto. Lo spazio rimanente viene distribuito tra gli elementi con weight proporzionalmente al loro peso. Questo comportamento è simile alla proprietà flex-grow in CSS Flexbox.
Secondo Android Developer Documentation, 2025, weight funziona solo all'interno di Row, Column e BoxWithConstraints. Quando si utilizza weight in Row, tutti gli elementi figli vengono misurati in due passaggi: prima gli elementi senza weight, poi gli elementi con weight.
@Composable
fun WeightExample() {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Start
) {
Text(
text = "Sinistra",
modifier = Modifier.weight(1.0f)
)
Text(text = "Destra")
}
}
Il primo esempio mostra Row con un'icona e testo — uno scenario tipico per un elenco di contatti o impostazioni. Icon e Text sono racchiusi in Row con verticalAlignment centrato.
@Composable
fun IconWithText() {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(8.dp)
) {
Icon(
imageVector = Icons.Default.Favorite,
contentDescription = "Favorite"
)
Spacer(modifier = Modifier.width(8.dp))
Text(text = "Aggiungi ai preferiti")
}
}
Il secondo esempio mostra Row con pulsanti e distribuzione uniforme. SpaceEvenly garantisce una spaziatura uguale tra tutti i pulsanti e i bordi del contenitore.
@Composable
fun ButtonRow() {
Row(
modifier = Modifier.fillMaxWidth().padding(16.dp),
horizontalArrangement = Arrangement.SpaceEvenly
) {
Button(onClick = {}) { Text("Annulla") }
Button(onClick = {}) { Text("Salva") }
}
}
Il terzo esempio — Row all'interno di una Card per visualizzare una valutazione. Una Row annidata con Modifier.weight consente alla stella di valutazione e al valore numerico di occupare spazio fisso.
@Composable
fun RatingRow(rating: Float) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "Valutazione:",
modifier = Modifier.weight(1.0f)
)
Text(text = "$rating / 5.0")
}
}
Row richiede il controllo della larghezza nel layout adattivo. Se il contenuto di Row supera la larghezza dello schermo disponibile, gli elementi potrebbero fuoriuscire dai limiti del contenitore. Per evitare ciò, utilizzare Modifier.horizontalScroll o passare a Column.
Quando si combina Row con Modifier.weight, è importante impostare fillMaxWidth sul Row padre — altrimenti weight distribuirà spazio inesistente. Secondo Material Design Guidelines, 2025, Row con weight senza fillMaxWidth è considerata una configurazione non valida.
Per interfacce adattive, si consiglia di combinare Row con Box o utilizzare Arrangement.SpaceBetween per la distribuzione automatica degli elementi su diverse dimensioni dello schermo. Ciò offre flessibilità senza query multimediali.
Domande frequenti
Row posiziona gli elementi orizzontalmente (da sinistra a destra), mentre Column li posiziona verticalmente (dall'alto in basso). Row sostituisce LinearLayout con orientamento orizzontale del vecchio approccio View, e Column sostituisce LinearLayout verticale.
Aggiungi il modificatore Modifier.horizontalScroll a Row. Per elenchi di grandi dimensioni con caricamento lento, utilizza LazyRow — renderizza solo gli elementi visibili e li ricicla durante lo scorrimento.
Sì, Row può essere annidata dentro un'altra Row, Column o Box. Durante l'annidamento, tieni presente che la Row interna riceverà la sua larghezza dal contenitore padre e, se necessario, imposta fillMaxWidth per ogni livello.
Modifier.weight distribuisce lo spazio rimanente in Row tra gli elementi figli proporzionalmente al peso specificato. Un elemento con peso 2.0f sarà largo il doppio di un elemento con peso 1.0f. Weight funziona solo all'interno di Row e Column.
Utilizza il parametro verticalAlignment = Alignment.CenterVertically quando crei Row. Questo allineerà tutti gli elementi figli lungo l'asse verticale indipendentemente dalla loro altezza.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche