CoordinatorLayout
هو ViewGroup
يتيح تخطيطات معقدة ومتداخلة
ومدمجة. ويتم استخدامه كسمة حاوية لتفعيل تفاعلات معيّنة في Material Design، مثل توسيع/تصغير أشرطة الأدوات والأوراق السفلية، في "العروض" المضمّنة فيه.
في ميزة "الإنشاء"، أقرب مكافئ لرمز CoordinatorLayout
هو
Scaffold
. يوفّر Scaffold
خانات محتوى لدمج مكونات Material
Components في أنماط الشاشة والتفاعلات الشائعة. توضّح هذه الصفحة كيفية
نقل عملية تنفيذ 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 له. تتلقّى دالةcontent
lambda فيScaffold
أيضًا مثيلًا من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 */ } } }
حالات الاستخدام الشائعة
تصغير أشرطة الأدوات وتوسيعها
في نظام العرض، لطيّ شريط الأدوات وتوسيعه باستخدام CoordinatorLayout
،
استخدِم AppBarLayout
كسمة حاوية لشريط الأدوات. يمكنك بعد ذلك تحديد Behavior
من خلال layout_behavior
في ملف XML على العنصر المرتبط
View (مثل RecyclerView
أو NestedScrollView
) لتحديد كيفية collapse/expand شريط الأدوات أثناء الانتقال للأعلى أو للأسفل.
في ميزة "الإنشاء"، يمكنك تحقيق تأثير مشابه من خلال
TopAppBarScrollBehavior
. على سبيل المثال، لتنفيذ شريط أدوات قابل للطي/التمديد
لكي يظهر شريط الأدوات عند الانتقال للأعلى، اتّبِع الخطوات التالية:
- يُرجى الاتصال برقم
TopAppBarDefaults.enterAlwaysScrollBehavior()
لإنشاءTopAppBarScrollBehavior
. - قدِّم
TopAppBarScrollBehavior
الذي تم إنشاؤه إلىTopAppBar
. اربط
NestedScrollConnection
عبرModifier.nestedScroll
في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
خاص بك وإزاحة شريط الأدوات يدويًا أثناء
انتقال المحتوى. يمكنك الاطّلاع على نموذج التمرير المُدمَج في AOSP للحصول على مثال على الرمز البرمجي.
أدراج
باستخدام "طرق العرض"، يمكنك تنفيذ درج تنقّل باستخدام ملف برمجي
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
المتوافقة مع تطبيق "الكتابة السحرية"، مثل
Scaffold
- نقل بيانات تطبيق Sunflower إلى Jetpack Compose: مشاركة مدوّنة توثّق عملية نقل بيانات تطبيق Sunflower النموذجي من Views إلى Compose، والذي يحتوي على
CoordinatorLayout
.
أفلام مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما تكون لغة JavaScript غير مفعّلة.
- مكونات Material وتنسيقاتها
- أجزاء النافذة المضمّنة في ميزة "الإنشاء"
- الانتقال للأعلى أو للأسفل