gpt4 book ai didi

android - 不显示 CalendarView Jetpack Compose 按钮

转载 作者:行者123 更新时间:2023-12-05 04:31:50 25 4
gpt4 key购买 nike

我有以下要求:用户可以在对话框的第一个文本字段中输入名称,但是当用户单击第二个(禁用的)文本字段时,应该打开 DatePicker。

我已经按照 SO 上的一些说明实现了一个日期选择器,但是我遇到了一个奇怪的 UI 错误,其中包含 CalendarView 下方的按钮。

这是我的日期选择器可组合项,包括 CustomCalendarView:

@Composable
fun JourneyDatePicker(
isVisible: Boolean = false,
date: Long?,
onDateSelected: (Long) -> Unit,
onDismissRequest: () -> Unit
) {
var selectedDate by remember {
mutableStateOf(
when {
date != null && date > 0L -> date
else -> DateTime.now().millis
}
)
}

if (isVisible) Dialog(
onDismissRequest = onDismissRequest,
properties = DialogProperties()
) {
Column(
modifier = Modifier
.wrapContentSize()
.background(
shape = RoundedCornerShape(size = 16.dp)
)
) {
Column(
Modifier
.defaultMinSize(minHeight = 72.dp)
.fillMaxWidth()
.background(
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp)
)
.padding(16.dp)
) {
Text(
text = "Datum auswählen"
)
Spacer(modifier = Modifier.size(24.dp))
Text(
text = DateTime().withMillis(selectedDate).toString(DateTimeFormat.longDate())
)
Spacer(modifier = Modifier.size(16.dp))
}
CustomCalendarView(
date = selectedDate,
onDateSelected = {
selectedDate = it
}
)
Spacer(modifier = Modifier.size(8.dp))
Row(
modifier = Modifier
.align(Alignment.End)
.padding(bottom = 16.dp, end = 16.dp)
) {
TextButton(
onClick = {
selectedDate = DateTime.now().millis
onDismissRequest()
}
) {
Text(
text = "Cancel",
color = Color.Black
)
}
TextButton(
onClick = {
onDateSelected(selectedDate)
onDismissRequest()
}
) {
Text(
text = "OK",
color = Color.Black
)
}
}
}
}
}

@Composable
fun CustomCalendarView(
date: Long?,
onDateSelected: (Long) -> Unit
) {
AndroidView(
modifier = Modifier.wrapContentSize(),
factory = { context ->
CalendarView(ContextThemeWrapper(context, R.style.DatePickerCustom))
},
update = { view ->
view.apply {
date?.let { d ->
if (d > 0L) setDate(d) else DateTime.now().millis
}
setOnDateChangeListener { _, year, month, dayOfMonth ->
onDateSelected(
DateTime
.now()
.withMonthOfYear(month + 1)
.withYear(year)
.withDayOfMonth(dayOfMonth)
.millis
)
}
}
}
)
}

问题是:

  • 当带有名称和日期两个输入字段的对话框打开并且我单击“日期”字段时,将显示 DatePicker 的按钮:

  • 当对话框打开并且我编辑名称然后单击“日期”字段时,按钮不显示:

我还使用 FocusManager 清除了焦点,以防万一这是键盘问题,但这也无济于事。

任何帮助将不胜感激:)

最佳答案

万一其他人遇到这个问题,我终于弄清楚问题是什么。

这基本上是打开的键盘与 Dialog() 可组合项如何计算对话框高度之间的问题。因为 Dialog() Composable 在键盘完全关闭之前计算可用高度,所以计算出的高度小于 Dialog 的实际可用高度。

所以你可以:

  • 在这种情况下不使用 Dialog() Composable 或
  • 在关闭键盘和打开对话框之间使用一个微小的延迟(这可行,但我推荐它)。

如果您想调试此问题,Dialog() 可组合项中的以下函数是一个很好的起点:

override fun internalOnMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)

关于android - 不显示 CalendarView Jetpack Compose 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71771588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com