首页 > 解决方案 > 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
        )
    }
}

标签: androidkotlinandroid-jetpack-compose

解决方案


在此答案中查看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
            }
    )
}

推荐阅读