android - Jetpack compose 中 AlertDialog 的 setOnKeyListener
问题描述
我们可以在 Android 中为对话框设置一个监听器:
dialog.setOnKeyListener(new Dialog.OnKeyListener() {
@Override
public boolean onKey(DialogInterface arg0, int keyCode,KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK) {
/* The user pressed back button - do whatever here.
Normally you dismiss the dialog like dialog.dismiss(); */
}
return true;
}
});
我们如何AlertDialog
在 Jetpack Compose 中做到这一点?
@Composable
private fun DisplayAlertDialog() {
val openDialog = remember { mutableStateOf(true) }
if (openDialog.value) {
AlertDialog(
onDismissRequest = { },
title = {
Text(
text = stringResource(id = R.string.settings),
fontSize = 18.sp
)
},
confirmButton = {
TextButton(
onClick = {
openDialog.value = false
}
) {
Text(stringResource(id = R.string.yes))
}
},
dismissButton = {
TextButton(
onClick = {
openDialog.value = false
}
) {
Text(stringResource(id = R.string.no))
}
},
backgroundColor = Color.White,
contentColor = Color.Black
)
}
}
解决方案
在此答案中查看Modifier.onKeyEvent用法的详细信息。
在这种情况下requestFocus
,必须从内部调用AlertDialog
以确保它已经出现。
在我的示例中,我使用文本字段来显示修饰符没有被中断。
var displayed by remember { mutableStateOf(true) }
if (displayed) {
val requester = remember { FocusRequester() }
AlertDialog(
onDismissRequest = {
println("dismissOnClickOutside")
displayed = false
},
buttons = {
var text by remember { mutableStateOf("") }
TextField(value = text, onValueChange = {text = it})
LaunchedEffect(Unit) {
requester.requestFocus()
}
},
properties = DialogProperties(
dismissOnBackPress = false,
),
modifier = Modifier
.focusRequester(requester)
.focusable()
.onKeyEvent {
if (it.nativeKeyEvent.keyCode != KeyEvent.KEYCODE_BACK) {
return@onKeyEvent false
}
println("dismissOnBackPress")
displayed = false
false
}
)
}
推荐阅读
- javascript - 如何计算自定义值的总和
- c++ - 如何设置 Fl_Text_Editor 的大小?
- c++ - C++ 中的 Const 与 Final
- c++ - 在 simgrid/C++ 上带有邮箱的流缓冲区
- python - 使用 tkinter 使 Entry 小部件随滚动条移动
- javascript - 调用window.open函数时如何在span标签中选择和属性
- powerbi - 在 Power Bi 的运行总计中按日期过滤
- elasticsearch - Elasticsearch:有没有办法按百万(或更多)用户 ID 过滤查询?
- r - 使用 R 中的字符向量提取矩阵中的特定元素
- flutter - Flutter:如何在 ListView 中有条件地重复 showDialog