How to Build a Custom Bottom Alert Dialog in Android Using Jetpack Compose

Learn how to create and customize bottom alert dialogs in Android using Jetpack Compose.

AndroidFeb 29, 2024Nagesh
How to Build a Custom Bottom Alert Dialog in Android Using Jetpack Compose

Create Custom Alert Dialog

Java
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.layout
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties


enum class CustomDialogPosition {
    BOTTOM, TOP
}

fun Modifier.customDialogModifier(pos: CustomDialogPosition) = layout { measurable, constraints ->
    val placeable = measurable.measure(constraints)
    layout(constraints.maxWidth, constraints.maxHeight){
        when(pos) {
            CustomDialogPosition.BOTTOM -> {
                placeable.place(0, constraints.maxHeight - placeable.height, 10f)
            }
            CustomDialogPosition.TOP -> {
                placeable.place(0,0,10f)
            }
        }
    }
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CustomAlertDialog(
    onDismissRequest: () -> Unit,
    properties: DialogProperties = DialogProperties(
        usePlatformDefaultWidth = false
    ),
    padding: PaddingValues = PaddingValues(16.dp),
    position: CustomDialogPosition = CustomDialogPosition.BOTTOM,
    content: @Composable () -> Unit
) {
    AlertDialog(onDismissRequest = onDismissRequest, modifier = Modifier
        .customDialogModifier(pos = position)
        .fillMaxWidth()
        .padding(padding),
        properties = properties
    ) {
        content()
    }
}

Usage

Java
@Composable
fun PushPermissionDialog(
    onDismissRequest: () -> Unit,
    onConfirmation: () -> Unit,
) {
    CustomAlertDialog(onDismissRequest = onDismissRequest) {
        ConfirmationDialogContent(
            title = "Enable Push Notification",
            message = "Allow push notification permission to get store related alerts through push notification.",
            confirmText = "Allow",
            cancelText = "Later",
            onConfirm = onConfirmation,
            onCancel = onDismissRequest
        )
    }
}

Preview / Screenshot

References

position-alert-dialog-in-android-compose

how-to-change-the-width-of-dialog-in-android-compose