Os menus suspensos permitem que os usuários cliquem em um ícone, campo de texto ou outro componente e selecionem uma lista de opções em uma superfície temporária. Este guia descreve como criar menus básicos e mais complexos com divisores e ícones.
Superfície da API
Use os componentes DropdownMenu
, DropdownMenuItem
e IconButton
para implementar um menu suspenso personalizado. Os componentes DropdownMenu
e
DropdownMenuItem
são usados para mostrar os itens do menu, enquanto o
IconButton
é o gatilho para mostrar ou ocultar o menu suspenso.
Os principais parâmetros do componente DropdownMenu
incluem:
expanded
: indica se o menu está visível.onDismissRequest
: usado para processar a dispensa do menu.content
: o conteúdo combinável do menu, normalmente contendo elementos combináveisDropdownMenuItem
.
Os principais parâmetros de DropdownMenuItem
incluem:
text
: define o conteúdo exibido no item de menu.onClick
: callback para processar a interação com o item no menu.
Criar um menu suspenso básico
O snippet a seguir demonstra uma implementação mínima de DropdownMenu
:
@Composable fun MinimalDropdownMenu() { var expanded by remember { mutableStateOf(false) } Box( modifier = Modifier .padding(16.dp) ) { IconButton(onClick = { expanded = !expanded }) { Icon(Icons.Default.MoreVert, contentDescription = "More options") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false } ) { DropdownMenuItem( text = { Text("Option 1") }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Option 2") }, onClick = { /* Do something... */ } ) } } }
Pontos principais sobre o código
- Define um
DropdownMenu
básico contendo dois itens de menu. - O parâmetro
expanded
controla a visibilidade do menu como aberto ou fechado. - O parâmetro
onDismissRequest
define um callback que é executado quando o usuário fecha o menu. - O elemento combinável
DropdownMenuItem
representa itens selecionáveis no menu suspenso. - Um
IconButton
aciona a expansão e o fechamento do menu.
Resultado
Criar um menu suspenso mais longo
O DropdownMenu
pode ser rolado por padrão se todos os itens do menu não puderem ser
exibidos de uma vez. O snippet a seguir cria um menu suspenso mais longo e rolável:
@Composable fun LongBasicDropdownMenu() { var expanded by remember { mutableStateOf(false) } // Placeholder list of 100 strings for demonstration val menuItemData = List(100) { "Option ${it + 1}" } Box( modifier = Modifier .padding(16.dp) ) { IconButton(onClick = { expanded = !expanded }) { Icon(Icons.Default.MoreVert, contentDescription = "More options") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false } ) { menuItemData.forEach { option -> DropdownMenuItem( text = { Text(option) }, onClick = { /* Do something... */ } ) } } } }
Pontos principais sobre o código
- O
DropdownMenu
pode ser rolado quando a altura total do conteúdo excede o espaço disponível. Esse código cria umDropdownMenu
rolável que mostra 100 itens de marcador de posição. - O loop
forEach
gera elementos combináveisDropdownMenuItem
dinamicamente. Os itens não são criados de forma lenta, o que significa que todos os 100 itens do menu suspenso são criados e existem na composição. - O
IconButton
aciona a expansão e o fechamento doDropdownMenu
quando clicado. - A lambda
onClick
em cadaDropdownMenuItem
permite definir a ação realizada quando o usuário seleciona um item de menu.
Resultado
O snippet de código anterior produz o seguinte menu rolável:
Criar um menu suspenso mais longo com divisores
O snippet a seguir mostra uma implementação mais avançada de um menu suspenso. Neste snippet, ícones iniciais e finais são adicionados aos itens de menu, e os divisores separam grupos de itens de menu.
@Composable fun DropdownMenuWithDetails() { var expanded by remember { mutableStateOf(false) } Box( modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { IconButton(onClick = { expanded = !expanded }) { Icon(Icons.Default.MoreVert, contentDescription = "More options") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false } ) { // First section DropdownMenuItem( text = { Text("Profile") }, leadingIcon = { Icon(Icons.Outlined.Person, contentDescription = null) }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Settings") }, leadingIcon = { Icon(Icons.Outlined.Settings, contentDescription = null) }, onClick = { /* Do something... */ } ) HorizontalDivider() // Second section DropdownMenuItem( text = { Text("Send Feedback") }, leadingIcon = { Icon(Icons.Outlined.Feedback, contentDescription = null) }, trailingIcon = { Icon(Icons.AutoMirrored.Outlined.Send, contentDescription = null) }, onClick = { /* Do something... */ } ) HorizontalDivider() // Third section DropdownMenuItem( text = { Text("About") }, leadingIcon = { Icon(Icons.Outlined.Info, contentDescription = null) }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Help") }, leadingIcon = { Icon(Icons.AutoMirrored.Outlined.Help, contentDescription = null) }, trailingIcon = { Icon(Icons.AutoMirrored.Outlined.OpenInNew, contentDescription = null) }, onClick = { /* Do something... */ } ) } } }
Esse código define um DropdownMenu
em um Box
.
Pontos principais sobre o código
- Os parâmetros
leadingIcon
etrailingIcon
adicionam ícones ao início e ao fim de umDropdownMenuItem
. - Um
IconButton
aciona a expansão do menu. - O
DropdownMenu
contém vários elementos combináveisDropdownMenuItem
, cada um representando uma ação selecionável. - Os elementos combináveis
HorizontalDivider
inserem uma linha horizontal para separar grupos de itens de menu.
Resultado
O snippet anterior produz um menu suspenso com ícones e divisores:
Outros recursos
- Material Design: Menus