Skip to content

Commit fbfd07d

Browse files
Filter chip dropdown menu (#375)
* Filter chip dropdown menu * Apply Spotless
1 parent 68fef6e commit fbfd07d

File tree

1 file changed

+90
-0
lines changed
  • compose/snippets/src/main/java/com/example/compose/snippets/components

1 file changed

+90
-0
lines changed

compose/snippets/src/main/java/com/example/compose/snippets/components/Menus.kt

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,34 @@
1616

1717
package com.example.compose.snippets.components
1818

19+
import androidx.compose.foundation.layout.Arrangement
1920
import androidx.compose.foundation.layout.Box
2021
import androidx.compose.foundation.layout.Column
22+
import androidx.compose.foundation.layout.Row
2123
import androidx.compose.foundation.layout.fillMaxSize
2224
import androidx.compose.foundation.layout.fillMaxWidth
2325
import androidx.compose.foundation.layout.padding
26+
import androidx.compose.foundation.layout.wrapContentSize
2427
import androidx.compose.material.icons.Icons
28+
import androidx.compose.material.icons.automirrored.filled.DirectionsBike
29+
import androidx.compose.material.icons.automirrored.filled.DirectionsRun
30+
import androidx.compose.material.icons.automirrored.filled.DirectionsWalk
2531
import androidx.compose.material.icons.automirrored.outlined.Help
2632
import androidx.compose.material.icons.automirrored.outlined.OpenInNew
2733
import androidx.compose.material.icons.automirrored.outlined.Send
34+
import androidx.compose.material.icons.filled.ArrowDropDown
35+
import androidx.compose.material.icons.filled.Check
36+
import androidx.compose.material.icons.filled.Hiking
2837
import androidx.compose.material.icons.filled.MoreVert
38+
import androidx.compose.material.icons.filled.Tune
2939
import androidx.compose.material.icons.outlined.Feedback
3040
import androidx.compose.material.icons.outlined.Info
3141
import androidx.compose.material.icons.outlined.Person
3242
import androidx.compose.material.icons.outlined.Settings
3343
import androidx.compose.material3.Button
3444
import androidx.compose.material3.DropdownMenu
3545
import androidx.compose.material3.DropdownMenuItem
46+
import androidx.compose.material3.FilterChip
3647
import androidx.compose.material3.FloatingActionButton
3748
import androidx.compose.material3.HorizontalDivider
3849
import androidx.compose.material3.Icon
@@ -76,6 +87,9 @@ fun MenusExamples() {
7687
Button(onClick = { currentExample = { DropdownMenuWithDetails() } }) {
7788
Text("Dropdown menu with sections and icons")
7889
}
90+
Button(onClick = { currentExample = { DropdownFilter() } }) {
91+
Text("Menu for applying a filter, attached to a filter chip")
92+
}
7993
}
8094
}
8195
}
@@ -212,3 +226,79 @@ fun DropdownMenuWithDetails() {
212226
fun DropdownMenuWithDetailsPreview() {
213227
DropdownMenuWithDetails()
214228
}
229+
230+
@Composable
231+
fun DropdownFilter(modifier: Modifier = Modifier) {
232+
Row(
233+
modifier = modifier
234+
.padding(16.dp)
235+
.wrapContentSize(unbounded = true),
236+
horizontalArrangement = Arrangement.spacedBy(8.dp),
237+
verticalAlignment = Alignment.CenterVertically
238+
) {
239+
Icon(Icons.Default.Tune, "Filters")
240+
FilterChip(selected = false, onClick = { /*TODO*/ }, label = { Text("Time") })
241+
DropdownFilterChip()
242+
FilterChip(selected = false, onClick = { /*TODO*/ }, label = { Text("Wheelchair accessible") })
243+
}
244+
}
245+
246+
// [START android_compose_components_dropdownfilterchip]
247+
@Composable
248+
fun DropdownFilterChip(modifier: Modifier = Modifier) {
249+
var isDropdownExpanded by remember { mutableStateOf(false) }
250+
var selectedChipText by remember { mutableStateOf<String?>(null) }
251+
Box(modifier) {
252+
FilterChip(
253+
selected = selectedChipText != null,
254+
onClick = { isDropdownExpanded = !isDropdownExpanded },
255+
label = { Text(if (selectedChipText == null) "Type" else "$selectedChipText") },
256+
leadingIcon = { if (selectedChipText != null) Icon(Icons.Default.Check, null) },
257+
trailingIcon = { Icon(Icons.Default.ArrowDropDown, null) },
258+
)
259+
DropdownMenu(
260+
expanded = isDropdownExpanded,
261+
onDismissRequest = { isDropdownExpanded = !isDropdownExpanded }
262+
) {
263+
DropdownMenuItem(
264+
text = { Text("Running") },
265+
leadingIcon = { Icon(Icons.AutoMirrored.Default.DirectionsRun, null) },
266+
onClick = {
267+
selectedChipText =
268+
if (selectedChipText == "Running") null else "Running"
269+
}
270+
)
271+
DropdownMenuItem(
272+
text = { Text("Walking") },
273+
leadingIcon = { Icon(Icons.AutoMirrored.Default.DirectionsWalk, null) },
274+
onClick = {
275+
selectedChipText =
276+
if (selectedChipText == "Walking") null else "Walking"
277+
}
278+
)
279+
DropdownMenuItem(
280+
text = { Text("Hiking") },
281+
leadingIcon = { Icon(Icons.Default.Hiking, null) },
282+
onClick = {
283+
selectedChipText =
284+
if (selectedChipText == "Hiking") null else "Hiking"
285+
}
286+
)
287+
DropdownMenuItem(
288+
text = { Text("Cycling") },
289+
leadingIcon = { Icon(Icons.AutoMirrored.Default.DirectionsBike, null) },
290+
onClick = {
291+
selectedChipText =
292+
if (selectedChipText == "Cycling") null else "Cycling"
293+
}
294+
)
295+
}
296+
}
297+
}
298+
// [END android_compose_components_dropdownfilterchip]
299+
300+
@Preview
301+
@Composable
302+
private fun DropdownFilterPreview() {
303+
DropdownFilter()
304+
}

0 commit comments

Comments
 (0)