CoordinatorLayout
karmaşık, çakışan ve iç içe yerleştirilmiş düzenler sağlayan bir ViewGroup
öğesidir. İçindeki Görünümler için genişletme/daraltma araç çubukları ve alt sayfalar gibi belirli Materyal Tasarım etkileşimlerini etkinleştirmek için bir kapsayıcı olarak kullanılır.
Compose'da CoordinatorLayout
öğesinin en yakın eşdeğeri Scaffold
şeklindedir. Scaffold
, Malzeme Bileşenlerini ortak ekran kalıpları ve etkileşimlerde birleştirmek için içerik alanları sağlar. Bu sayfada, Compose'da Scaffold
kullanmak için CoordinatorLayout
uygulamanızı nasıl taşıyabileceğiniz açıklanmaktadır.
Taşıma adımları
CoordinatorLayout
dosyasını Scaffold
hizmetine taşımak için şu adımları uygulayın:
Aşağıdaki snippet'te
CoordinatorLayout
, birToolBar
, birViewPager
ve birFloatingActionButton
içerenAppBarLayout
öğesi içeriyor. Kullanıcı arayüzü hiyerarşinizdekiCoordinatorLayout
ve alt öğelerini yorumlayın ve değiştirmek için birComposeView
ekleyin.<!-- <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" />
Parça veya Etkinliğinizde, az önce eklediğiniz
ComposeView
için referans alın vesetContent
yöntemini çağırın. Yöntemin gövdesindeScaffold
öğesini içerik olarak ayarlayın:composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold contents // ... } }
Scaffold
içeriğinde ekranınızın birincil içeriğini buna ekleyin. Yukarıdaki XML'de yer alan birincil içerikViewPager2
olduğundan, Compose'un eşdeğeri olanHorizontalPager
öğesini kullanacağız.Scaffold
öğesinincontent
lambdası da içerik köküne uygulanması gereken birPaddingValues
örneği alır. AynıPaddingValues
öğesiniHorizontalPager
öğesine uygulamak içinModifier.padding
kullanabilirsiniz.composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> val pagerState = rememberPagerState { 10 } HorizontalPager( state = pagerState, modifier = Modifier.padding(contentPadding) ) { /* Page contents */ } } }
Daha fazla ekran öğesi eklemek ve kalan alt Görüntüleme sayısını taşımak için
Scaffold
tarafından sağlanan diğer içerik alanlarını kullanın.topBar
alanınıTopAppBar
eklemek için,floatingActionButton
alanını daFloatingActionButton
eklemek için kullanabilirsiniz.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 */ } } }
Yaygın kullanım alanları
Araç çubuklarını daraltma ve genişletme
Görünüm sisteminde, araç çubuğunu CoordinatorLayout
ile daraltmak ve genişletmek için araç çubuğu için kapsayıcı olarak bir AppBarLayout
kullanırsınız. Daha sonra, ilişkili kaydırılabilir Görünümde (RecyclerView
veya NestedScrollView
gibi) XML'de Behavior
ile layout_behavior
arasında bir değer belirterek araç çubuğunun siz kaydırdıkça nasıl daraldığını/genişlediğini belirtebilirsiniz.
E-posta Yazma'da, TopAppBarScrollBehavior
aracılığıyla benzer bir efekt elde edebilirsiniz. Örneğin, yukarı kaydırdığınızda araç çubuğunun görünmesi amacıyla daraltılabilen/genişleyen bir araç çubuğu uygulamak için aşağıdaki adımları uygulayın:
TopAppBarScrollBehavior
oluşturmak içinTopAppBarDefaults.enterAlwaysScrollBehavior()
numaralı telefonu arayın.- Oluşturulan
TopAppBarScrollBehavior
öğesiniTopAppBar
ile paylaşın. Kaydırılabilir içerik yukarı/aşağı kaydırılırken İskele'nin iç içe yerleştirilmiş kaydırma etkinliklerini alabilmesi için
Scaffold
üzerindeNestedScrollConnection
aracınıModifier.nestedScroll
aracılığıyla bağlayın. Böylece, içerik kaydırılırken içerilen uygulama çubuğu uygun şekilde daralabilir/genişleyebilir.// 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 */ // ... }
Daraltma/genişleme kaydırma efektini özelleştirme
Daraltma/genişleyen animasyon efektini özelleştirmek için enterAlwaysScrollBehavior
'e çeşitli parametreler sağlayabilirsiniz. TopAppBarDefaults
, uygulama çubuğunu yalnızca içerik tamamen aşağı kaydırıldığında genişleten exitUntilCollapsedScrollBehavior
gibi başka bir TopAppBarScrollBehavior
de sunar.
Tamamen özel bir efekt (örneğin, paralaks efekti) oluşturmak için kendi NestedScrollConnection
öğenizi de oluşturabilir ve içerik kaydırılırken araç çubuğunu manuel olarak kaydırabilirsiniz. Kod örneği için AOSP'deki İç içe yerleştirilmiş kaydırma örneğine bakın.
Çekmeceler
Görünümler'de, kök görünüm olarak bir DrawerLayout
kullanarak gezinme çekmecesi uygulayabilirsiniz. Bu durumda CoordinatorLayout
, DrawerLayout
öğesinin alt görünümüdür. DrawerLayout
, çekmecede gezinme seçeneklerini görüntülemek için NavigationView
gibi başka bir alt görünüm de içerir.
Compose'da ModalNavigationDrawer
composable'ı kullanarak gezinme çekmecesi uygulayabilirsiniz. ModalNavigationDrawer
, çekmece için drawerContent
, ekran içeriği için content
alanı sunar.
ModalNavigationDrawer( drawerContent = { ModalDrawerSheet { Text("Drawer title", modifier = Modifier.padding(16.dp)) Divider() NavigationDrawerItem( label = { Text(text = "Drawer Item") }, selected = false, onClick = { /*TODO*/ } ) // ...other drawer items } } ) { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold content // ... } }
Daha fazla bilgi edinmek için Çekmeceler başlıklı makaleye bakın.
Snackbar'lar
Scaffold
, Snackbar
görüntülemek için SnackbarHost
composable'ı kabul edebilen snackbarHost
alanı sağlar.
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 // ... }
Daha fazla bilgi edinmek için Snackbar'lar bölümüne bakın.
Daha fazla bilgi
CoordinatorLayout
öğesini Compose'a taşıma hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara göz atın:
- Materyal Bileşenleri ve düzenleri: Compose'da desteklenen Materyal Tasarım bileşenleri hakkında
Scaffold
gibi belgeler. - Sunflower'ı Jetpack Compose'a taşıma:
CoordinatorLayout
içeren Sunflower örnek uygulamasının Görünümler'den Compose'a geçiş sürecini belgeleyen bir blog yayını.
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Malzeme Bileşenleri ve düzenleri
- Compose'da pencere içleri
- Kaydırma