CoordinatorLayout — это ViewGroup , позволяющий создавать сложные, перекрывающиеся и вложенные макеты. Он используется в качестве контейнера для реализации определенных взаимодействий в стиле Material Design, таких как разворачивание/сворачивание панелей инструментов и нижних панелей, для элементов View, находящихся внутри него.
В Compose ближайшим аналогом CoordinatorLayout является Scaffold . Scaffold предоставляет слоты контента для объединения компонентов Material в стандартные шаблоны экранов и взаимодействия. На этой странице описано, как можно перевести вашу реализацию CoordinatorLayout на использование Scaffold в Compose.
Этапы миграции
Для переноса CoordinatorLayout в Scaffold выполните следующие шаги:
В приведенном ниже фрагменте
CoordinatorLayoutсодержитAppBarLayout, в котором размещаютсяToolBar,ViewPagerиFloatingActionButton. ЗакомментируйтеCoordinatorLayoutи его дочерние элементы в иерархии пользовательского интерфейса и добавьтеComposeViewдля его замены.<!-- <androidx.coordinatorlayout.widget.CoordinatorLayout--> <!-- android:id="@+id/coordinator_layout"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent"--> <!-- android:fitsSystemWindows="true">--> <!-- <androidx.compose.ui.platform.ComposeView--> <!-- android:id="@+id/compose_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent"--> <!-- app:layout_behavior="@string/appbar_scrolling_view_behavior" />--> <!-- <com.google.android.material.appbar.AppBarLayout--> <!-- android:id="@+id/app_bar_layout"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="wrap_content"--> <!-- android:fitsSystemWindows="true"--> <!-- android:theme="@style/Theme.Sunflower.AppBarOverlay">--> <!-- AppBarLayout contents here --> <!-- </com.google.android.material.appbar.AppBarLayout>--> <!-- </androidx.coordinatorlayout.widget.CoordinatorLayout>--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" />В вашем фрагменте или активности получите ссылку на только что добавленный
ComposeViewи вызовите методsetContent. В теле метода установитеScaffoldв качестве его содержимого:composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold contents // ... } }
В содержимое вашего
Scaffoldдобавьте основное содержимое экрана. Поскольку основное содержимое в приведенном выше XML-коде представляет собойViewPager2, мы будем использоватьHorizontalPager, который является его эквивалентом в Compose. Лямбда-функцияcontentScaffoldтакже получает экземплярPaddingValues, который должен быть применен к корневому элементу содержимого. Вы можете использоватьModifier.padding, чтобы применить те жеPaddingValuesкHorizontalPager.composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> val pagerState = rememberPagerState { 10 } HorizontalPager( state = pagerState, modifier = Modifier.padding(contentPadding) ) { /* Page contents */ } } }
Используйте другие слоты контента, предоставляемые
Scaffold, чтобы добавить больше элементов экрана и перенести оставшиеся дочерние представления. Вы можете использовать слотtopBarдля добавленияTopAppBar, а слотfloatingActionButtonдля предоставленияFloatingActionButton.composeView.setContent { Scaffold( Modifier.fillMaxSize(), topBar = { TopAppBar( title = { Text("My App") } ) }, floatingActionButton = { FloatingActionButton( onClick = { /* Handle click */ } ) { Icon( Icons.Filled.Add, contentDescription = "Add Button" ) } } ) { contentPadding -> val pagerState = rememberPagerState { 10 } HorizontalPager( state = pagerState, modifier = Modifier.padding(contentPadding) ) { /* Page contents */ } } }
Типичные сценарии использования
Сворачивать и разворачивать панели инструментов
В системе View для сворачивания и разворачивания панели инструментов с помощью CoordinatorLayout используется AppBarLayout в качестве контейнера для панели инструментов. Затем можно указать Behavior через layout_behavior в XML для соответствующего прокручиваемого представления (например, RecyclerView или NestedScrollView ), чтобы определить, как панель инструментов будет сворачиваться/разворачиваться при прокрутке.
В Compose аналогичный эффект можно достичь с помощью TopAppBarScrollBehavior . Например, чтобы реализовать сворачивающуюся/разворачивающуюся панель инструментов, которая появляется при прокрутке вверх, выполните следующие действия:
- Вызовите метод
TopAppBarDefaults.enterAlwaysScrollBehavior()для создания объектаTopAppBarScrollBehavior. - Передайте созданный класс
TopAppBarScrollBehaviorклассуTopAppBar. Подключите
NestedScrollConnectionчерезModifier.nestedScrollкScaffold, чтобы Scaffold мог получать события вложенной прокрутки по мере прокрутки прокручиваемого контента вверх/вниз. Таким образом, встроенная панель приложения сможет корректно сворачиваться/разворачиваться по мере прокрутки контента.// 1. Create the TopAppBarScrollBehavior val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() Scaffold( topBar = { TopAppBar( title = { Text("My App") }, // 2. Provide scrollBehavior to TopAppBar scrollBehavior = scrollBehavior ) }, // 3. Connect the scrollBehavior.nestedScrollConnection to the Scaffold modifier = Modifier .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection) ) { contentPadding -> /* Contents */ // ... }
Настройте эффект сворачивания/разворачивания при прокрутке.
Для параметра enterAlwaysScrollBehavior можно задать несколько параметров, чтобы настроить эффект анимации сворачивания/разворачивания. TopAppBarDefaults также предоставляет другие TopAppBarScrollBehavior , такие как exitUntilCollapsedScrollBehavior , который разворачивает панель приложения только тогда, когда содержимое прокручено до конца.
Для создания полностью пользовательского эффекта (например, эффекта параллакса) вы также можете создать собственное NestedScrollConnection и вручную смещать панель инструментов по мере прокрутки контента. Пример кода можно найти в примере Nested scroll на AOSP.
Ящики
В Views вы реализуете боковую панель навигации , используя DrawerLayout в качестве корневого представления. В свою очередь, ваш CoordinatorLayout является дочерним представлением DrawerLayout . DrawerLayout также содержит другое дочернее представление, например NavigationView , для отображения параметров навигации в боковой панели.
В Compose можно реализовать выдвижную панель навигации, используя компонуемый объект ModalNavigationDrawer . ModalNavigationDrawer предоставляет слот drawerContent для панели и слот content для содержимого экрана.
ModalNavigationDrawer( drawerContent = { ModalDrawerSheet { Text("Drawer title", modifier = Modifier.padding(16.dp)) HorizontalDivider() NavigationDrawerItem( label = { Text(text = "Drawer Item") }, selected = false, onClick = { /*TODO*/ } ) // ...other drawer items } } ) { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold content // ... } }
Подробнее см. в разделе «Ящики» .
Снэк-бары
Scaffold предоставляет слот snackbarHost , который может принимать компонент SnackbarHost для отображения Snackbar .
val scope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } Scaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, floatingActionButton = { ExtendedFloatingActionButton( text = { Text("Show snackbar") }, icon = { Icon(Icons.Filled.Image, contentDescription = "") }, onClick = { scope.launch { snackbarHostState.showSnackbar("Snackbar") } } ) } ) { contentPadding -> // Screen content // ... }
Подробнее см. в разделе «Закусочные батончики» .
Узнать больше
Для получения дополнительной информации о переносе CoordinatorLayout в Compose см. следующие ресурсы:
- Компоненты и макеты Material Design : Документация по компонентам Material Design, поддерживаемым в Compose, таким как
Scaffold. - Переход с Sunflower на Jetpack Compose : статья в блоге, описывающая процесс миграции с Views на Compose в демонстрационном приложении Sunflower, содержащем
CoordinatorLayout.
Рекомендуем вам
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Компоненты материалов и компоновка
- Вставки окон в Compose
- Прокрутка