Диалоги на устройствах Sasung (One UI) выровнены по нижней части экрана.

У меня есть две функции для отображения диалогов в моем приложении: одна — для отображения диалога с индикатором выполнения (с использованиемDialogкомпонент), а второй — показать диалог с кнопками (с помощьюAlertDialogкомпонент). я используюcompose 1.3.2иandroidx.compose.material 1.4.0-alpha03.

Все нормально, диалог расположен по центру экрана на всех устройствах, кроме Samsung с One UI.

На Samsung диалоги выравниваются по нижней части экрана.

Нашёл такую ​​статью и оказалось, что это нормальное поведение критических диалогов и диалогов с выбором или подтверждением, однако рекомендуют отображать диалоги прогресса в центре экрана.

Как я могу выровнять свой диалог так, чтобы он был центрирован на всех устройствах?

Вот код моего диалога прогресса

      @Composable
private fun ProgressDialog(state: ProgressDialogState) {
    Dialog(
        onDismissRequest = state.onCancel ?: {},
        properties = DialogProperties(dismissOnBackPress = false, dismissOnClickOutside = false)
    ) {
        Box(
            contentAlignment = Alignment.Center,
            modifier = Modifier
                .size(80.dp)
                .background(AppTheme.colors.background, shape = AppShapes.medium)
        ) {
            CircularProgressIndicator(color = AppTheme.colors.primary)
        }
    }
}

1 ответ

Итак, единственное решение, которое я нашел — заменить Dialog на собственную реализацию — просто затемнить полноэкранное поле с содержимым.

      @Composable
fun ProgressDialog(state: AppState.ProgressDialogState) {
    val show = remember(state) { state.isShowing }

    // Dialog replaced with Box due to bottom position of dialogs on some Samsung devices
    if (show) Box(
        modifier = Modifier
            .fillMaxSize()
            .background(color = MaterialTheme.colorScheme.scrim.copy(alpha = .55f))
            .clickable(
                interactionSource = remember { MutableInteractionSource() },
                indication = null,
                onClick = {
                    // click interceptor
                }
            ),
        contentAlignment = Alignment.Center
    ) {

        Box(
            contentAlignment = Alignment.Center,
            modifier = Modifier
                .size(80.dp)
                .background(AppTheme.colors.bgPrimary, shape = AppShapes.medium)
        ) {
            CircularProgressIndicator(color = AppTheme.colors.buttonPrimary)
        }
    }
}