Search code examples
androidkotlinandroid-edittextandroid-jetpack-composeandroid-spinner

How to make EditText act like a spinner in Jetpack compose


I'm trying to get an EditText view to show a spinner when clicked then display the selection or at least something like the underlined spinner but with a leading and trailing icon.

PS: The EditText view would look like a proper EditText view with hints, icons and all

Is there any way to do this in Compose please?


Solution

  • ExposedDropdownMenu is what you looking for i assume

    @OptIn(ExperimentalMaterialApi::class)
    fun ExposedSelectionMenu(
        title: String,
        index: Int,
        options: List<String>,
        onSelected: (Int) -> Unit
    ) {
    
        var expanded by remember { mutableStateOf(false) }
        var selectedOptionText by remember { mutableStateOf(options[index]) }
    
        ExposedDropdownMenuBox(
            modifier = Modifier
                .fillMaxWidth()
                .padding(vertical = 4.dp),
            expanded = expanded,
            onExpandedChange = {
                expanded = !expanded
            }
        ) {
            TextField(
                modifier = Modifier.fillMaxWidth(),
                readOnly = true,
                value = selectedOptionText,
                onValueChange = { },
                label = { Text(title) },
                trailingIcon = {
                    ExposedDropdownMenuDefaults.TrailingIcon(
                        expanded = expanded
                    )
                },
                colors = ExposedDropdownMenuDefaults.textFieldColors(
                    backgroundColor = Color.White,
                    focusedIndicatorColor = Color.Transparent,
                    unfocusedIndicatorColor = Color.Transparent,
                    disabledIndicatorColor = Color.Transparent,
                )
            )
            ExposedDropdownMenu(
                modifier = Modifier.fillMaxWidth(),
                expanded = expanded,
                onDismissRequest = {
                    expanded = false
    
                }
            ) {
                options.forEachIndexed { index: Int, selectionOption: String ->
                    DropdownMenuItem(
                        modifier = Modifier.fillMaxWidth(),
                        onClick = {
                            selectedOptionText = selectionOption
                            expanded = false
                            onSelected(index)
                        }
                    ) {
                        Text(text = selectionOption)
                    }
                }
            }
        }
    }