28. Feb 2023Android

Jetpack Compose Basics – Hledáte alternativu k menu nebo dialogovým oknům? Vyzkoušejte Modal Bottom Sheet

Bottom Sheet je komponenta, která se používá jako doplňková plocha ukotvená ke spodní části obrazovky. Tento článek bude o přesném typu Bottom Sheet – Modal Bottom Sheet a o tom, jak ho použít v Jetpack Compose.

Peter ŠulyAndroid developer

Jedná se o alternativu k menu nebo dialogovým oknům, musí se zavřít (přetažením prstem nebo jinou uživatelskou interakcí), abyste mohli interagovat s obsahem obrazovky. V Jetpack Compose je bottom sheet implementovaný pomocí composable ModalBottomSheet.

Anatomie bottom sheetu. 1 – bottom sheet content, 2 – row of bottom sheet, 3 – overlaid screen content

Jak vytvořit Bottom Sheet v Jetpack Compose?

ModalBottomSheet má 3 možné stavy definované prostřednictvím parametru sheetState typu ModalBottomSheetValue. Možné hodnoty jsou Hidden, Expanded nebo HalfExpanded. Předvolená hodnota stavu listu je Hidden, vlastní stav si lze zapamatovat takto

val sheetState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden)

Jako obvykle má ModalBottomSheet v Jetpack Compose mnoho parametrů k přizpůsobení, přičemž dva z nich jsou povinné.

fun ModalBottomSheetLayout(
    sheetContent: @Composable ColumnScope.() -> Unit,
    modifier: Modifier = Modifier,
    sheetState: ModalBottomSheetState = rememberModalBottomSheetState(Hidden),
    sheetShape: Shape = MaterialTheme.shapes.large,
    sheetElevation: Dp = ModalBottomSheetDefaults.Elevation,
    sheetBackgroundColor: Color = MaterialTheme.colors.surface,
    sheetContentColor: Color = contentColorFor(sheetBackgroundColor),
    scrimColor: Color = ModalBottomSheetDefaults.scrimColor,
    content: @Composable () -> Unit
)

Povinné parametry

  • sheetContent – composable s obsahem z bottom sheetu
  • content – composable s obsahem obrazovky za spodním listem. Tento obsah je překrytý scrimColor, když je bottom sheet ve stavu Expanded.

Volitelné parametry

  • sheetState – řídí stav ModalBottomSheet
  • modifier – používá se pro změny z caller side
  • sidesheetShape – tvar spodního listu, např. *RoundedCornerShape* (topStart = 24.*dp*, topEnd = 24.*dp*)
  • sheetElevation – výška bottom sheetu v dp sheetBackgroundColor – barva pozadí spodního listu, v předvolbě nastavená na povrchovou barvu
  • sheetContentColor – barva obsahu kontrastující s barvou pozadí, předvolená hodnota, vypočítá se pomocí funkce contentColorFor
  • scrimColor – barva překryvu aplikovaná na obsah, když je viditelný bottom sheet
Chování bottom sheetu

Jak otevřít ModalBottomSheet kliknutím na tlačítko?

Pro animovaný přechod ModalBottomSheet jsou k dispozici funkce show() a hide(), které je možné vyvolat na modalBottomSheetState. Jedná se o funkci suspend, protože k jejich použití je nutná animace spuštěná jako coroutine, scope nebo LaunchedEffect.

val sheetState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden)

Button(
    onClick = {
        scope.launch { 
						// Important part
            sheetState.show()  
        }
    },
    content = { ... }
)

Jak zakázat stav Half Expanded v ModalBottomSheet?

V některých případech není stav HalfExpanded žádoucí a naštěstí existuje způsob, jak ho zakázat vrácením hodnoty false v lambda confirmStateChange.

val sheetState = rememberModalBottomSheetState(
    initialValue = ModalBottomSheetValue.Hidden,
    confirmStateChange = { it != ModalBottomSheetValue.HalfExpanded }
)

Další články ze série Jetpack Compose Basics:

Peter ŠulyAndroid developer