Material 3 Search Bars in Jetpack Compose

Material 3 Search Bars in Jetpack Compose

Get started with Material 3 search bars in Jetpack Compose to create user-friendly interfaces for searching content.

Explore Search Bar Styles

Learn to implement two Material 3 search bar types for displaying results or suggestions.

There are two Search Bar styles:
  1. Basic (with Suggestions)
  2. Customizable (with Filtered List)

Basic Search Bar

Displays a search field with suggestions below it.


@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SimpleSearchBar(
    textFieldState: TextFieldState,
    onSearch: (String) -> Unit,
    searchResults: List,
    modifier: Modifier = Modifier
) {
    var expanded by rememberSaveable { mutableStateOf(false) }
    Box(
        modifier
            .fillMaxSize()
            .semantics { isTraversalGroup = true }
    ) {
        SearchBar(
            modifier = Modifier
                .align(Alignment.TopCenter)
                .semantics { traversalIndex = 0f },
            inputField = {
                SearchBarDefaults.InputField(
                    query = textFieldState.text.toString(),
                    onQueryChange = { textFieldState.edit { replace(0, length, it) } },
                    onSearch = {
                        onSearch(textFieldState.text.toString())
                        expanded = false
                    },
                    expanded = expanded,
                    onExpandedChange = { expanded = it },
                    placeholder = { Text("Search") }
                )
            },
            expanded = expanded,
            onExpandedChange = { expanded = it },
        ) {
            Column(Modifier.verticalScroll(rememberScrollState())) {
                searchResults.forEach { result ->
                    ListItem(
                        headlineContent = { Text(result) },
                        modifier = Modifier
                            .clickable {
                                textFieldState.edit { replace(0, length, result) }
                                expanded = false
                            }
                            .fillMaxWidth()
                    )
                }
            }
        }
    }
}
  

Use a Basic Search Bar when you want to display suggestions based on user input.

Examples:

  • Search contacts in a messaging app
  • Find products in an e-commerce app
  • Query articles in a news app

Customizable Search Bar

Filters a list with customizable icons and supporting content.


@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CustomizableSearchBar(
    query: String,
    onQueryChange: (String) -> Unit,
    onSearch: (String) -> Unit,
    searchResults: List,
    onResultClick: (String) -> Unit,
    placeholder: @Composable () -> Unit = { Text("Search") },
    leadingIcon: @Composable (() -> Unit)? = { Icon(Icons.Default.Search, contentDescription = "Search") },
    trailingIcon: @Composable (() -> Unit)? = null,
    supportingContent: (@Composable (String) -> Unit)? = null,
    leadingContent: (@Composable () -> Unit)? = null,
    modifier: Modifier = Modifier
) {
    var expanded by rememberSaveable { mutableStateOf(false) }
    Box(
        modifier
            .fillMaxSize()
            .semantics { isTraversalGroup = true }
    ) {
        SearchBar(
            modifier = Modifier
                .align(Alignment.TopCenter)
                .semantics { traversalIndex = 0f },
            inputField = {
                SearchBarDefaults.InputField(
                    query = query,
                    onQueryChange = onQueryChange,
                    onSearch = {
                        onSearch(query)
                        expanded = false
                    },
                    expanded = expanded,
                    onExpandedChange = { expanded = it },
                    placeholder = placeholder,
                    leadingIcon = leadingIcon,
                    trailingIcon = trailingIcon
                )
            },
            expanded = expanded,
            onExpandedChange = { expanded = it },
        ) {
            LazyColumn {
                items(count = searchResults.size) { index ->
                    val resultText = searchResults[index]
                    ListItem(
                        headlineContent = { Text(resultText) },
                        supportingContent = supportingContent?.let { { it(resultText) } },
                        leadingContent = leadingContent,
                        colors = ListItemDefaults.colors(containerColor = Color.Transparent),
                        modifier = Modifier
                            .clickable {
                                onResultClick(resultText)
                                expanded = false
                            }
                            .fillMaxWidth()
                            .padding(horizontal = 16.dp, vertical = 4.dp)
                    )
                }
            }
        }
    }
}
  

Use a Customizable Search Bar when you want to filter results with enhanced visuals.

Examples:

  • Filter items in a product catalog
  • Search with icons in a contacts app
  • Query with additional metadata in a search app

Search Bar Properties

Understand the key properties used in the search bar examples.

Property Usage
inputField* Required: Defines the input field using SearchBarDefaults.InputField
query* Required: Displays the search query text
onQueryChange* Required: Handles query text changes
expanded Controls visibility of suggestions/results
onExpandedChange Handles changes to expanded state
onSearch Triggers search action
placeholder Displays placeholder text in input field
leadingIcon Displays an icon at the start of the input field
trailingIcon Displays an icon at the end of the input field
supportingContent Adds additional content to search results

Post a Comment

Previous Post Next Post