Диалоги на устройствах 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)
}
}
}