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:
- Basic (with Suggestions)
- 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 |
Tags:
Jetpack Compose Dev