【问题标题】:setOnKeyListener for AlertDialog in jetpack composeJetpack compose 中 AlertDialog 的 setOnKeyListener
【发布时间】:2021-10-19 09:54:03
【问题描述】:

我们可以在 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;
        }
    });

我们如何在 Jetpack Compose 中为 AlertDialog 做到这一点?

@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
        )
    }
}

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    this answer 中查看Modifier.onKeyEvent 的使用详情。

    在这种情况下,必须从 AlertDialog 内部调用 requestFocus 以确保它已经出现。

    在我的示例中,我使用一个文本字段来显示修饰符没有被中断。

    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
                }
        )
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 2021-12-17
      • 2022-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多