Я хочу создать составной элемент для обработки общих настроек, которые отображают диалог (например, чтобы заменить EditTextPreference
и ListPreference
API предпочтений Androidx).
Идея состоит в том, что это GenericSettingWithDialog
принимает на вход Composable, обрабатывающий содержимое диалога:
@Composable
fun GenericSettingWithDialog (
name: String,
state: State<String>,
dialogContent: @Composable ()-> Unit
) {
var isDialogShown by remember {
mutableStateOf(false)
}
if (isDialogShown) {
Dialog(onDismissRequest = {
isDialogShown = false
}) {
dialogContent()
}
}
// setting row launching the dialog, with title and graphics
}
К сожалению, эта реализация не может обрабатывать запросы на закрытие диалога, поступающие из самого диалога, например, при нажатии кнопки «Подтвердить».
Я работаю над возможностью использования функциональных литералов Kotlin с получателем, как показано в этом ответе: Функция Jetpack Compose с лямбда() -> Unit, но пока непонятно как.
@user3791775 user3791775, к сожалению, нет, мне нужен диалог, потому что мне нужно настроить его внешний вид и поведение.
@perissf используйте AlertDialog и настройте его с помощью stackoverflow.com/questions/22655599/…
@BobSmith, к сожалению, нет, вопрос связан с Android Compose, а не с представлениями
Если вы хотите закрыть диалог по событию DialogContent, мы можем передать лямбда-функцию в dialogContent: @Composable ()-> Unit
, как показано ниже.
Обновлен код GenericSettingWithDialog.
@Composable
fun GenericSettingWithDialog (
name: String,
state: State<String>,
dialogContent: @Composable ( onDismiss: (() -> Unit)? )-> Unit
) {
var isDialogShown by remember {
mutableStateOf(true)
}
if (isDialogShown) {
Dialog(onDismissRequest = {
isDialogShown = false
}) {
dialogContent(){
isDialogShown = false
}
}
}
// setting row launching the dialog, with title and graphics
}
При использовании вышеуказанной функции следуйте инструкциям ниже.
GenericSettingWithDialog("abc",str){onDismiss->
Box(modifier = Modifier
.size(250.dp)
.background(Grey1)){
Box (modifier = Modifier
.size(50.dp)
.background(Color.Red)
.clickable {
onDismiss?.invoke()
}){
}
}
}
Здесь onDismiss вызывается, когда вы хотите закрыть диалог из диалогаContent.
Ваше здоровье!!
Вместо этого я использую AlertDialog, в котором есть встроенные обработчики DisclaimButton и ConfirmButton.