喷气背包组成。日期时间选择器

Dmi*_*hin 7 android android-jetpack android-jetpack-compose

喷气背包是否有日期时间选择器视图,还是我应该自己创建?我试图用谷歌搜索它,但我找不到准备使用的组件。

Roh*_*har 12

您可以在jetpack compose中用几行显示日期选择器

@Composable
fun showDatePicker() {
    AndroidView(
        { CalendarView(it) },
        modifier = Modifier.wrapContentWidth(),
        update = { views ->
            views.setOnDateChangeListener { calendarView, year, month, dayOfMonth ->
            }
        }
    )
}
Run Code Online (Sandbox Code Playgroud)


Abd*_*bri 8

使用库

在撰写本文时,它还没有实施。但是有一个开源库Compose Material Dialogs

日期和时间选择器

没有图书馆

您也可以在没有库的情况下执行此操作,您可以将其放在 onclick 操作中

private fun showDatePicker() {
    val picker = MaterialDatePicker.Builder.datePicker().build()
    activity?.let {
        picker.show(it.supportFragmentManager, picker.toString())
        picker.addOnPositiveButtonClickListener {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

旧的方式:D


Joa*_*zzi 7

看来他们仍在努力,与此同时,如果您需要一些非常简单的东西,您可以使用 compose 与 Android 视图的互操作:

@Composable
fun DatePicker(onDateSelected: (LocalDate) -> Unit, onDismissRequest: () -> Unit) {
    val selDate = remember { mutableStateOf(LocalDate.now()) }

    //todo - add strings to resource after POC
    Dialog(onDismissRequest = { onDismissRequest() }, properties = DialogProperties()) {
        Column(
            modifier = Modifier
                .wrapContentSize()
                .background(
                    color = MaterialTheme.colors.surface,
                    shape = RoundedCornerShape(size = 16.dp)
                )
        ) {
            Column(
                Modifier
                    .defaultMinSize(minHeight = 72.dp)
                    .fillMaxWidth()
                    .background(
                        color = MaterialTheme.colors.primary,
                        shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp)
                    )
                    .padding(16.dp)
            ) {
                Text(
                    text = "Select date".toUpperCase(Locale.ENGLISH),
                    style = MaterialTheme.typography.caption,
                    color = MaterialTheme.colors.onPrimary
                )

                Spacer(modifier = Modifier.size(24.dp))

                Text(
                    text = selDate.value.format(DateTimeFormatter.ofPattern("MMM d, YYYY")),
                    style = MaterialTheme.typography.h4,
                    color = MaterialTheme.colors.onPrimary
                )

                Spacer(modifier = Modifier.size(16.dp))
            }

            CustomCalendarView(onDateSelected = {
                selDate.value = it
            })

            Spacer(modifier = Modifier.size(8.dp))

            Row(
                modifier = Modifier
                    .align(Alignment.End)
                    .padding(bottom = 16.dp, end = 16.dp)
            ) {
                TextButton(
                    onClick = onDismissRequest
                ) {
                    //TODO - hardcode string
                    Text(
                        text = "Cancel",
                        style = MaterialTheme.typography.button,
                        color = MaterialTheme.colors.onPrimary
                    )
                }

                TextButton(
                    onClick = {
                        onDateSelected(selDate.value)
                        onDismissRequest()
                    }
                ) {
                    //TODO - hardcode string
                    Text(
                        text = "OK",
                        style = MaterialTheme.typography.button,
                        color = MaterialTheme.colors.onPrimary
                    )
                }

            }
        }
    }
}

@Composable
fun CustomCalendarView(onDateSelected: (LocalDate) -> Unit) {
    // Adds view to Compose
    AndroidView(
        modifier = Modifier.wrapContentSize(),
        factory = { context ->
            CalendarView(ContextThemeWrapper(context, R.style.CalenderViewCustom))
        },
        update = { view ->
            view.minDate = // contraints
            view.maxDate = // contraints

            view.setOnDateChangeListener { _, year, month, dayOfMonth ->
                onDateSelected(
                    LocalDate
                        .now()
                        .withMonth(month + 1)
                        .withYear(year)
                        .withDayOfMonth(dayOfMonth)
                )
            }
        }
    )
}

<style name="CalenderViewCustom" parent="ThemeOverlay.MaterialComponents.MaterialCalendar">
        <item name="colorAccent"><day selection color></item>
        <item name="colorOnPrimary"><text color></item>
        <item name="colorSurface"><background color></item>
</style>
Run Code Online (Sandbox Code Playgroud)

你最终会得到这样的结果:

在此处输入图片说明

  • @ritwikshanker如果你需要在较低的API中使用这个解决方案只需将LocalDate更改为Date (3认同)
  • 我按照@ShadeToD的建议对代码进行了一些修改,现在它与Material Design 3兼容。看看我的要点:https://gist.github.com/ArnyminerZ/31b82f559e3bfe42ef336f72854c5854 (2认同)

Cha*_*ler 7

没有第三方库,使用Android View解决方案:

import android.app.TimePickerDialog

@Composable
fun ShowTimePicker(context: Context, initHour: Int, initMinute: Int) {
    val time = remember { mutableStateOf("") }
    val timePickerDialog = TimePickerDialog(
        context,
        {_, hour : Int, minute: Int ->
            time.value = "$hour:$minute"
        }, initHour, initMinute, false
    )
    Button(onClick = {
        timePickerDialog.show()
    }) {
        Text(text = "Open Time Picker")
    }
}
Run Code Online (Sandbox Code Playgroud)

用户界面效果

谢基兰-巴哈拉斯卡

  • 您可以使用以下方式获取上下文:`val context = LocalContext.current` (4认同)

Gab*_*tti 6

从 M3 开始,1.1.0-alpha04官方支持DatePicker

val datePickerState = rememberDatePickerState()
DatePicker(
    datePickerState = datePickerState,
    modifier = Modifier.padding(16.dp)
)
Text("Selected date timestamp: ${datePickerState.selectedDateMillis ?: "no selection"}")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Tha*_*Zin 5

目前,jetpack compose 处于 Alpha 状态,androidx.ui.* 中没有 DateTime Picker。但是,稍后 android 团队将添加它或使 jetpack compose 与其他组件(如 android.widget.DatePicker 进行互操作)或者我们可以使用 jetpack compose 从 stratch 中开发漂亮的日期时间选择器,就像flutter 所做的一样

目前,

class DateTimeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val c = Calendar.getInstance()
        val year = c.get(Calendar.YEAR)
        val month = c.get(Calendar.MONTH)
        val day = c.get(Calendar.DAY_OF_MONTH)
        val mHour = c[Calendar.HOUR_OF_DAY]
        val mMinute = c[Calendar.MINUTE]

        val datePickerDialog = DatePickerDialog(
            this, DatePickerDialog.OnDateSetListener
            { datePicker: DatePicker, day: Int, month: Int, year: Int ->
                setContent {
                    Column {
                        Text("$day, $month, $year")
                    }
                }
            }, year, month, day
        )


        val timePickerDialog = TimePickerDialog(
            this,
            TimePickerDialog.OnTimeSetListener { view, hourOfDay, minute ->
                setContent {
                    Column {
                        Text("$hourOfDay:$minute")
                    }
                }
            }, mHour, mMinute, false
        )


        setContent {
            Column {
                Button(text = "Date",
                    style = OutlinedButtonStyle(),
                    onClick = {
                        datePickerDialog.show()
                    })
                Button(text = "Time",
                    style = OutlinedButtonStyle(),
                    onClick = {
                        timePickerDialog.show()
                    })
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)