Skip to content

Commit f67b849

Browse files
Add example of date picker textfield opening picker dialog on click (#376)
* Add example of date picker textfield opening picker dialog on click * Apply Spotless
1 parent fbfd07d commit f67b849

File tree

1 file changed

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

1 file changed

+55
-0
lines changed

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

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
package com.example.compose.snippets.components
1818

1919
import androidx.compose.foundation.background
20+
import androidx.compose.foundation.gestures.awaitEachGesture
21+
import androidx.compose.foundation.gestures.awaitFirstDown
22+
import androidx.compose.foundation.gestures.waitForUpOrCancellation
2023
import androidx.compose.foundation.layout.Arrangement
2124
import androidx.compose.foundation.layout.Box
2225
import androidx.compose.foundation.layout.Column
@@ -49,12 +52,24 @@ import androidx.compose.runtime.setValue
4952
import androidx.compose.ui.Alignment
5053
import androidx.compose.ui.Modifier
5154
import androidx.compose.ui.draw.shadow
55+
import androidx.compose.ui.input.pointer.PointerEventPass
56+
import androidx.compose.ui.input.pointer.pointerInput
57+
import androidx.compose.ui.tooling.preview.Preview
5258
import androidx.compose.ui.unit.dp
5359
import androidx.compose.ui.window.Popup
60+
import com.example.compose.snippets.touchinput.userinteractions.MyAppTheme
5461
import java.text.SimpleDateFormat
5562
import java.util.Date
5663
import java.util.Locale
5764

65+
@Preview
66+
@Composable
67+
private fun DatePickerPreview() {
68+
MyAppTheme {
69+
DatePickerExamples()
70+
}
71+
}
72+
5873
// [START android_compose_components_datepicker_examples]
5974
// [START_EXCLUDE]
6075
@Composable
@@ -77,6 +92,9 @@ fun DatePickerExamples() {
7792
Text("Docked date picker:")
7893
DatePickerDocked()
7994

95+
Text("Open modal picker on click")
96+
DatePickerFieldToModal()
97+
8098
Text("Modal date pickers:")
8199
Button(onClick = { showModal = true }) {
82100
Text("Show Modal Date Picker")
@@ -259,6 +277,43 @@ fun DatePickerDocked() {
259277
}
260278
}
261279

280+
@Composable
281+
fun DatePickerFieldToModal(modifier: Modifier = Modifier) {
282+
var selectedDate by remember { mutableStateOf<Long?>(null) }
283+
var showModal by remember { mutableStateOf(false) }
284+
285+
OutlinedTextField(
286+
value = selectedDate?.let { convertMillisToDate(it) } ?: "",
287+
onValueChange = { },
288+
label = { Text("DOB") },
289+
placeholder = { Text("MM/DD/YYYY") },
290+
trailingIcon = {
291+
Icon(Icons.Default.DateRange, contentDescription = "Select date")
292+
},
293+
modifier = modifier
294+
.fillMaxWidth()
295+
.pointerInput(selectedDate) {
296+
awaitEachGesture {
297+
// Modifier.clickable doesn't work for text fields, so we use Modifier.pointerInput
298+
// in the Initial pass to observe events before the text field consumes them
299+
// in the Main pass.
300+
awaitFirstDown(pass = PointerEventPass.Initial)
301+
val upEvent = waitForUpOrCancellation(pass = PointerEventPass.Initial)
302+
if (upEvent != null) {
303+
showModal = true
304+
}
305+
}
306+
}
307+
)
308+
309+
if (showModal) {
310+
DatePickerModal(
311+
onDateSelected = { selectedDate = it },
312+
onDismiss = { showModal = false }
313+
)
314+
}
315+
}
316+
262317
fun convertMillisToDate(millis: Long): String {
263318
val formatter = SimpleDateFormat("MM/dd/yyyy", Locale.getDefault())
264319
return formatter.format(Date(millis))

0 commit comments

Comments
 (0)