ExposedDropdownMenuBox
Composable Component
Box for Exposed Dropdown Menu. Expected to contain TextField
and
ExposedDropdownMenuBoxScope.ExposedDropdownMenu
as a content.
Common
@ExperimentalMaterialApi
@Composable
fun ExposedDropdownMenuBox(
expanded: Boolean,
onExpandedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier,
content: @Composable ExposedDropdownMenuBoxScope.() -> Unit,
)
Parameters
expanded | Whether Dropdown Menu should be expanded or not. |
onExpandedChange | Executes when the user clicks on the ExposedDropdownMenuBox. |
modifier | The modifier to apply to this layout |
content | The content to be displayed inside ExposedDropdownMenuBox. |
Code Examples
ExposedDropdownMenuSample
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun ExposedDropdownMenuSample() {
val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
var expanded by remember { mutableStateOf(false) }
val textFieldState = rememberTextFieldState(options[0])
// We want to react on tap/press on TextField to show menu
ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }) {
TextField(
readOnly = true,
state = textFieldState,
label = { Text("Label") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
colors = ExposedDropdownMenuDefaults.textFieldColors(),
)
ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
options.forEach { selectionOption ->
DropdownMenuItem(
onClick = {
textFieldState.setTextAndPlaceCursorAtEnd(selectionOption)
expanded = false
}
) {
Text(text = selectionOption)
}
}
}
}
}
EditableExposedDropdownMenuSample
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun EditableExposedDropdownMenuSample() {
val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
var expanded by remember { mutableStateOf(false) }
val textFieldState = rememberTextFieldState()
ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }) {
TextField(
state = textFieldState,
label = { Text("Label") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
colors = ExposedDropdownMenuDefaults.textFieldColors(),
)
// filter options based on text field value
val filteringOptions =
options.filter { it.contains(textFieldState.text, ignoreCase = true) }
if (filteringOptions.isNotEmpty()) {
ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
filteringOptions.forEach { selectionOption ->
DropdownMenuItem(
onClick = {
textFieldState.setTextAndPlaceCursorAtEnd(selectionOption)
expanded = false
}
) {
Text(text = selectionOption)
}
}
}
}
}
}
Create your own Component Library
Material Components are meant to be used as is and they do not allow customizations. To build your own Jetpack Compose component library use Compose Unstyled