提问人:mpellegr 提问时间:11/10/2023 更新时间:11/15/2023 访问量:48
如何关闭在单击通常展开它的按钮时无法聚焦的展开下拉菜单
How to dismiss an expanded drop down menu that is not focusable when clicking the button that normally expands it
问:
我有一个按钮可以展开我的可组合项中的下拉菜单。我将下拉菜单设置为不使用焦点(我必须这样做,以便在展开下拉菜单时键盘不会被关闭)。现在我遇到了一个问题,即在菜单已经展开时单击展开按钮以显示菜单会导致两次重组,导致菜单仍然被展开并且没有按预期关闭。第一次重构时,它会关闭菜单并将我的 rememebered 值设置为 false。然后,当调用按钮的 lambda 时,将设置回 true,从而导致第二次重组,再次展开菜单。如果菜单已展开,如何允许通过单击展开按钮来关闭菜单?PopupProperties(focusable = false)
expanded
onClick
expanded
var expanded by remember { mutableStateOf(false) }
Box() {
IconButton(onClick = { expanded = true })
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
properties = PopupProperties(focusable = false)
)
}
答:
1赞
mpellegr
11/21/2023
#1
我能找到的唯一解决方案是一个棘手的解决方法,即在对单击按钮做出反应之前使用 100 毫秒的延迟。在大多数情况下效果很好,但真正快速的点击似乎“什么都不做”。
var dismissedTimeMillis by remember { mutableStateOf<Long?>(null) }
var expanded by remember { mutableStateOf(false) }
Box() {
IconButton(onClick =
dismissedTimeMillis.let {
if (it == null || (System.currentTimeMillis() - it) > 100L) {
expanded = true
}
})
DropdownMenu(
expanded = expanded,
onDismissRequest = {
expanded = false
dismissedTimeMillis = System.currentTimeMillis()
},
properties = PopupProperties(focusable = false)
)
}
0赞
Phil Dukhov
11/21/2023
#2
这看起来像一个错误,因为根据文档,focusable
应该只控制“IME 事件和按键”。
因此,延迟解决方法应该有效,直到它被修复。
评论
derivedStateOf
expanded
onDismissRequest
System.currentTimeMillis()