پلتفرم اندروید وظیفه ترسیم رابط کاربری سیستم مانند نوار وضعیت و نوار ناوبری را بر عهده دارد. این رابط کاربری سیستم صرف نظر از اینکه کاربر از کدام برنامه استفاده می کند، نمایش داده می شود.
WindowInsets
اطلاعاتی در مورد رابط کاربری سیستم ارائه می دهد تا اطمینان حاصل کند که برنامه شما در ناحیه درست طراحی می شود و رابط کاربری شما توسط رابط کاربری سیستم مبهم نیست.
![لبه به لبه بروید تا پشت میله های سیستم بکشید](https://developer.android.com/static/develop/ui/compose/images/layouts/insets/e2e-intro.gif?authuser=2&hl=fa)
در اندروید 14 (سطح API 34) و پایینتر، رابط کاربری برنامه شما بهطور پیشفرض زیر نوارهای سیستم و برشهای نمایشگر کشیده نمیشود.
در Android 15 (سطح API 35) و بالاتر، زمانی که برنامه شما SDK 35 را هدف قرار داد، برنامه شما زیر نوارهای سیستم و بریدگیهای صفحه نمایش کشیده میشود. این منجر به تجربه کاربری یکپارچهتر میشود و به برنامه شما اجازه میدهد تا از فضای پنجره موجود برای استفاده کامل استفاده کند. آن را
نمایش محتوا در پشت رابط کاربری سیستم ، لبه به لبه نامیده می شود. در این صفحه، در مورد انواع مختلف inset ها، نحوه استفاده از لبه به لبه، و نحوه استفاده از API های داخلی برای متحرک سازی UI خود و اطمینان از اینکه محتوای برنامه شما توسط عناصر UI سیستم پنهان نمی شود، آشنا می شوید.
درج اصول
هنگامی که یک برنامه لبه به لبه می شود، باید اطمینان حاصل کنید که محتوا و تعاملات مهم توسط رابط کاربری سیستم مبهم نیست. به عنوان مثال، اگر دکمه ای در پشت نوار ناوبری قرار داده شود، ممکن است کاربر نتواند روی آن کلیک کند.
اندازه UI سیستم و اطلاعات مربوط به محل قرارگیری آن از طریق inset ها مشخص می شود.
هر بخش از UI سیستم دارای یک نوع ورودی متناظر است که اندازه و محل قرارگیری آن را توصیف می کند. به عنوان مثال، نوار وضعیت اندازه و موقعیت نوار وضعیت را ارائه می دهد، در حالی که نوارهای ناوبری اندازه و موقعیت نوار پیمایش را ارائه می دهند. هر نوع اینست از چهار بعد پیکسل تشکیل شده است: بالا، چپ، راست و پایین. این ابعاد مشخص میکند که رابط کاربری سیستم تا چه اندازه از طرفهای مربوطه پنجره برنامه امتداد دارد. بنابراین، برای جلوگیری از همپوشانی با آن نوع رابط کاربری سیستم، رابط کاربری برنامه باید با آن مقدار درج شود.
این انواع داخلی اندروید از طریق WindowInsets
در دسترس هستند:
ورودی هایی که نوارهای وضعیت را توصیف می کنند. اینها نوارهای رابط کاربری بالای سیستم هستند که حاوی نمادهای اعلان و سایر نشانگرها هستند. | |
نوار وضعیت برای زمانی که آنها قابل مشاهده هستند درج می شود. اگر نوارهای وضعیت در حال حاضر پنهان هستند (به دلیل وارد شدن به حالت تمام صفحه همهجانبه)، در این صورت نوارهای وضعیت اصلی خالی خواهند بود، اما این ورودی ها خالی نیستند. | |
ورودیهایی که نوارهای ناوبری را توصیف میکنند. اینها نوارهای رابط کاربری سیستم در سمت چپ، راست یا پایین دستگاه هستند که نوار وظیفه یا نمادهای پیمایش را توصیف می کنند. اینها می توانند در زمان اجرا بر اساس روش پیمایش ترجیحی کاربر و تعامل با نوار وظیفه تغییر کنند. | |
نوار پیمایش برای زمانی که آنها قابل مشاهده هستند درج می شود. اگر نوارهای پیمایش در حال حاضر پنهان هستند (به دلیل وارد شدن به حالت تمام صفحه همهجانبه)، در این صورت نوارهای ناوبری اصلی خالی خواهند بود، اما این ورودی ها خالی نیستند. | |
قسمتی که دکوراسیون پنجره رابط کاربری سیستم را در صورتی که در یک پنجره آزاد شکل است، مانند نوار عنوان بالا، توصیف می کند. | |
نوار عنوان برای زمانی که قابل مشاهده هستند درج می شود. اگر نوارهای زیرنویس در حال حاضر پنهان هستند، در این صورت نوارهای زیرنویس اصلی خالی خواهند بود، اما این ورودیها خالی نیستند. | |
اتحاد نوارهای سیستمی که شامل نوارهای وضعیت، نوارهای پیمایش و نوار شرح است. | |
نوار سیستم برای زمانی که آنها قابل مشاهده هستند درج می شود. اگر نوارهای سیستم در حال حاضر پنهان هستند (به دلیل وارد شدن به حالت تمام صفحه همهجانبه)، در این صورت نوارهای اصلی سیستم خالی خواهند بود، اما این ورودی ها خالی نیستند. | |
ورودیهایی که میزان فضای پایینی را که صفحهکلید نرمافزار اشغال میکند را توصیف میکند. | |
ورودیهایی که میزان فضایی را که صفحهکلید نرمافزار قبل از انیمیشن صفحهکلید فعلی اشغال کرده بود، توصیف میکند. | |
ورودیهایی که میزان فضایی را که صفحهکلید نرمافزار بعد از انیمیشن صفحهکلید فعلی اشغال میکند را توصیف میکند. | |
نوعی از ورودیها که اطلاعات دقیقتری را درباره رابط کاربری ناوبری توصیف میکند، و میزان فضایی را که «ضربهها» توسط سیستم و نه برنامه انجام میشود، ارائه میدهد. برای نوارهای پیمایش شفاف با ناوبری اشاره ای، برخی از عناصر برنامه را می توان از طریق رابط کاربری ناوبری سیستم لمس کرد. | |
عنصر قابل ضربه زدن برای زمانی که قابل مشاهده هستند درج می شود. اگر عناصر قابل ضربه زدن در حال حاضر پنهان هستند (به دلیل وارد شدن به حالت تمام صفحه همهجانبه)، آنگاه ورودی های اصلی عناصر قابل لمس خالی خواهند بود، اما این ورودی ها خالی نیستند. | |
ورودیها نشاندهنده مقدار ورودیهایی هستند که سیستم حرکات را برای پیمایش رهگیری میکند. برنامهها میتوانند بهطور دستی مدیریت تعداد محدودی از این حرکات را از طریق | |
زیرمجموعهای از ژستهای حرکتی سیستم که همیشه توسط سیستم مدیریت میشود و نمیتوان از طریق | |
ورودی ها نشان دهنده میزان فاصله مورد نیاز برای جلوگیری از همپوشانی با بریدگی نمایشگر (بریدگی یا سوراخ سوزنی) هستند. | |
قسمت های داخلی نمایانگر نواحی منحنی نمایشگر آبشار است. نمایشگر آبشاری دارای نواحی منحنی در امتداد لبههای صفحه است که در آن صفحه شروع به پیچیدن در کنارههای دستگاه میکند. |
این انواع با سه نوع درج "ایمن" خلاصه می شوند که تضمین می کند محتوا مبهم نیست:
این انواع درج "ایمن" از محتوا به روش های مختلف محافظت می کنند، بر اساس درج های پلت فرم زیرین:
- از
WindowInsets.safeDrawing
برای محافظت از محتوایی که نباید زیر هیچ رابط کاربری سیستمی کشیده شود، استفاده کنید. این رایج ترین استفاده از inset ها است: برای جلوگیری از ترسیم محتوایی که توسط رابط کاربری سیستم (چه به طور جزئی یا کامل) مبهم است. - از
WindowInsets.safeGestures
برای محافظت از محتوا با حرکات استفاده کنید. این کار از تداخل حرکات سیستم با حرکات برنامه (مانند موارد مربوط به صفحات پایین، چرخ فلک ها یا در بازی ها) جلوگیری می کند. - از
WindowInsets.safeContent
به عنوان ترکیبی ازWindowInsets.safeDrawing
وWindowInsets.safeGestures
استفاده کنید تا مطمئن شوید محتوا همپوشانی بصری و همپوشانی حرکتی ندارد.
راه اندازی Insets
برای اینکه برنامهتان کنترل کاملی بر جایی که محتوا را میکشد کنترل کند، این مراحل راهاندازی را دنبال کنید. بدون این مراحل، برنامه شما ممکن است رنگهای سیاه یا یکدست را پشت رابط کاربری سیستم بکشد، یا به طور همزمان با صفحهکلید نرمافزار متحرک نشود.
- SDK 35 یا بالاتر را هدف قرار دهید تا لبه به لبه را در Android 15 و بالاتر اعمال کنید . برنامه شما در پشت رابط کاربری سیستم نمایش داده می شود. میتوانید رابط کاربری برنامهتان را با مدیریت insets تنظیم کنید.
- در صورت تمایل،
enableEdgeToEdge()
را درActivity.onCreate()
فراخوانی کنید، که به برنامه شما اجازه می دهد در نسخه های قبلی اندروید لبه به لبه باشد. android:windowSoftInputMode="adjustResize"
را در ورودیAndroidManifest.xml
Activity خود تنظیم کنید. این تنظیم به برنامه شما اجازه میدهد تا اندازه نرمافزار IME را بهعنوان ورودی دریافت کند، که میتوانید هنگام نمایش و ناپدید شدن IME در برنامهتان، از آن برای صفحهبندی و چیدمان مناسب محتوا استفاده کنید.<!-- in your AndroidManifest.xml file: --> <activity android:name=".ui.MainActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.MyApplication" android:exported="true">
API ها را بنویسید
هنگامی که Activity شما کنترل همه موارد داخلی را به دست گرفت، می توانید از Compose API استفاده کنید تا مطمئن شوید که محتوا مبهم نیست و عناصر قابل تعامل با رابط کاربری سیستم همپوشانی ندارند. این APIها همچنین طرحبندی برنامه شما را با تغییرات داخلی همگامسازی میکنند.
به عنوان مثال، این ابتدایی ترین روش اعمال inset ها در محتوای کل برنامه شما است:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { Box(Modifier.safeDrawingPadding()) { // the rest of the app } } }
این قطعه، ورودیهای پنجره safeDrawing
را بهعنوان بالشتک در اطراف کل محتوای برنامه اعمال میکند. در حالی که این تضمین می کند که عناصر قابل تعامل با رابط کاربری سیستم همپوشانی ندارند، همچنین به این معنی است که هیچ یک از برنامه ها برای دستیابی به یک جلوه لبه به لبه، پشت رابط کاربری سیستم قرار نمی گیرند. برای استفاده کامل از کل پنجره، باید جایی که ورودیها بر اساس صفحه به صفحه یا جزء به جزء اعمال میشوند را دقیق تنظیم کنید.
همه این انواع inset به طور خودکار با انیمیشنهای IME که به API 21 پسپورت شدهاند، متحرک میشوند. با گسترش، همه طرحبندیهای شما با استفاده از این insetها نیز بهطور خودکار با تغییر مقادیر inset متحرک میشوند.
دو روش اصلی برای استفاده از این انواع داخلی برای تنظیم طرحبندیهای Composable وجود دارد: اصلاحکنندههای padding و اصلاحکننده اندازه inset.
اصلاح کننده های پد
Modifier.windowInsetsPadding(windowInsets: WindowInsets)
ورودی های پنجره داده شده را به عنوان padding اعمال می کند، درست مانند Modifier.padding
. به عنوان مثال، Modifier.windowInsetsPadding(WindowInsets.safeDrawing)
ورودی های طراحی ایمن را به عنوان بالشتک در هر 4 طرف اعمال می کند.
همچنین چندین روش کاربردی داخلی برای رایج ترین انواع داخلی وجود دارد. Modifier.safeDrawingPadding()
یکی از این روشها است که معادل Modifier.windowInsetsPadding(WindowInsets.safeDrawing)
. اصلاح کننده های مشابهی برای سایر انواع داخلی وجود دارد.
اصلاحکنندههای اندازه داخلی
اصلاحکنندههای زیر با تنظیم اندازه مؤلفه به اندازه ورودیها، مقداری از ورودیهای پنجره را اعمال میکنند:
سمت شروع windowInsets را به عنوان عرض اعمال می کند (مانند | |
سمت انتهایی windowInsets را به عنوان عرض اعمال می کند (مانند | |
سمت بالای windowInsets را به عنوان ارتفاع اعمال می کند (مانند | |
| سمت پایین windowInsets را به عنوان ارتفاع اعمال می کند (مانند |
این اصلاحکنندهها بهویژه برای اندازهگیری یک Spacer
که فضای ورودیها را اشغال میکند مفید هستند:
LazyColumn( Modifier.imePadding() ) { // Other content item { Spacer( Modifier.windowInsetsBottomHeight( WindowInsets.systemBars ) ) } }
مصرف داخلی
اصلاحکنندههای padding ( windowInsetsPadding
و کمکهایی مانند safeDrawingPadding
) بهطور خودکار بخشی از insetهایی را که بهعنوان padding اعمال میشوند مصرف میکنند. در حالی که به عمق درخت ترکیب میروید، اصلاحکنندههای بالشتک داخلی تودرتو و اصلاحکنندههای اندازه درونی میدانند که بخشی از اینستها قبلاً توسط اصلاحکنندههای بالشتک داخلی خارجی مصرف شدهاند، و از استفاده از همان بخش داخلی بیش از یک بار که منجر به فضای اضافی بیش از حد
اصلاحکنندههای اندازه داخلی همچنین از استفاده بیش از یکبار از همان قسمت داخلی خودداری میکنند، در صورتی که اینستها قبلاً مصرف شده باشند. با این حال، از آنجایی که آنها به طور مستقیم اندازه خود را تغییر می دهند، خودشان دمنوش ها را مصرف نمی کنند.
در نتیجه، اصلاحکنندههای بالشتک تودرتو بهطور خودکار میزان padding اعمالشده برای هر ترکیبسازی را تغییر میدهند.
با نگاهی به مثال LazyColumn
قبلی، اندازه LazyColumn
توسط اصلاح کننده imePadding
تغییر می کند. در داخل LazyColumn
، آخرین مورد به اندازه ارتفاع پایین نوارهای سیستم است:
LazyColumn( Modifier.imePadding() ) { // Other content item { Spacer( Modifier.windowInsetsBottomHeight( WindowInsets.systemBars ) ) } }
هنگامی که IME بسته است، اصلاح کننده imePadding()
هیچ padding اعمال نمی کند، زیرا IME ارتفاع ندارد. از آنجایی که اصلاحکننده imePadding()
هیچ بالشتکی اعمال نمیکند، هیچ ورودی مصرف نمیشود و ارتفاع Spacer
به اندازه سمت پایین میلههای سیستم خواهد بود.
هنگامی که IME باز می شود، IME برای مطابقت با اندازه IME، متحرک سازی را وارد می کند، و اصلاح کننده imePadding()
شروع به اعمال padding پایین برای تغییر اندازه LazyColumn
با باز شدن IME می کند. هنگامی که اصلاح کننده imePadding()
شروع به اعمال padding پایین می کند، شروع به مصرف آن مقدار inset نیز می کند. بنابراین، ارتفاع Spacer
شروع به کاهش می کند، زیرا بخشی از فاصله برای نوارهای سیستم قبلاً توسط اصلاح کننده imePadding()
اعمال شده است. هنگامی که اصلاح کننده imePadding()
مقداری از لایه پایینی را که بزرگتر از نوارهای سیستم است اعمال می کند، ارتفاع Spacer
صفر می شود.
هنگامی که IME بسته می شود، تغییرات به صورت معکوس اتفاق می افتد: زمانی که imePadding()
کمتر از سمت پایین نوارهای سیستم اعمال می شود، Spacer
از ارتفاع صفر شروع به گسترش می کند، تا اینکه در نهایت Spacer
با ارتفاع ضلع پایینی مطابقت کند. هنگامی که IME کاملاً متحرک شد، سیستم نوار میشود.
TextField
. این رفتار از طریق ارتباط بین همه اصلاحکنندههای windowInsetsPadding
انجام میشود و میتواند به چند روش دیگر تحت تأثیر قرار گیرد.
Modifier.consumeWindowInsets(insets: WindowInsets)
نیز مانند Modifier.windowInsetsPadding
، ورودیها را مصرف میکند، اما ورودیهای مصرفشده را بهعنوان padding اعمال نمیکند. این در ترکیب با اصلاحکنندههای اندازه داخلی مفید است، تا به خواهر و برادر نشان دهد که مقدار مشخصی از اینست قبلاً مصرف شده است:
Column(Modifier.verticalScroll(rememberScrollState())) { Spacer(Modifier.windowInsetsTopHeight(WindowInsets.systemBars)) Column( Modifier.consumeWindowInsets( WindowInsets.systemBars.only(WindowInsetsSides.Vertical) ) ) { // content Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime)) } Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.systemBars)) }
Modifier.consumeWindowInsets(paddingValues: PaddingValues)
بسیار شبیه به نسخه دارای آرگومان WindowInsets
عمل می کند، اما برای مصرف یک PaddingValues
دلخواه می گیرد. این برای اطلاع دادن به کودکان مفید است زمانی که بالشتک یا فاصله با مکانیسم دیگری غیر از اصلاحکنندههای بالشتک داخلی، مانند یک Modifier.padding
معمولی یا فاصلهدهنده ارتفاع ثابت، ارائه میشود:
@OptIn(ExperimentalLayoutApi::class) Column(Modifier.padding(16.dp).consumeWindowInsets(PaddingValues(16.dp))) { // content Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime)) }
در مواردی که ورودیهای پنجره خام بدون مصرف مورد نیاز هستند، از مقادیر WindowInsets
مستقیماً استفاده کنید یا از WindowInsets.asPaddingValues()
برای برگرداندن PaddingValues
از ورودیهایی که تحت تأثیر مصرف نیستند، استفاده کنید. با این حال، با توجه به هشدارهای زیر، ترجیح میدهید تا حد امکان از اصلاحکنندههای padding insets و تعدیلکنندههای اندازه insets پنجره استفاده کنید.
مراحل Insets و Jetpack Compose
Compose از APIهای اصلی AndroidX برای بهروزرسانی و متحرک سازی insetها استفاده میکند، که از APIهای پلتفرم زیربنایی برای مدیریت ورودیها استفاده میکنند. به دلیل رفتار پلتفرم، Inset ها رابطه خاصی با فازهای Jetpack Compose دارند.
ارزش inset ها پس از مرحله ترکیب، اما قبل از مرحله طرح بندی به روز می شوند. این بدان معنی است که خواندن مقدار insets در ترکیب معمولاً از مقدار insets استفاده می کند که یک فریم تاخیر دارد. اصلاحکنندههای داخلی توضیحدادهشده در این صفحه به گونهای ساخته شدهاند که استفاده از مقادیر ورودیها را تا مرحله طرحبندی به تأخیر بیاندازند، که تضمین میکند که مقادیر ورودی در همان قاب بهروزرسانی شده استفاده میشوند.
انیمیشن های صفحه کلید IME با WindowInsets
میتوانید Modifier.imeNestedScroll()
به یک محفظه پیمایشی اعمال کنید تا هنگام اسکرول کردن به پایین ظرف، IME را به طور خودکار باز و بسته کنید.
class WindowInsetsExampleActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) setContent { MaterialTheme { MyScreen() } } } } @OptIn(ExperimentalLayoutApi::class) @Composable fun MyScreen() { Box { LazyColumn( modifier = Modifier .fillMaxSize() // fill the entire window .imePadding() // padding for the bottom for the IME .imeNestedScroll(), // scroll IME at the bottom content = { } ) FloatingActionButton( modifier = Modifier .align(Alignment.BottomEnd) .padding(16.dp) // normal 16dp of padding for FABs .navigationBarsPadding() // padding for navigation bar .imePadding(), // padding for when IME appears onClick = { } ) { Icon(imageVector = Icons.Filled.Add, contentDescription = "Add") } } }
![انیمیشنی که یک عنصر رابط کاربری را نشان میدهد که به سمت بالا و پایین حرکت میکند تا جای خود را برای صفحهکلید باز کند](https://developer.android.com/static/develop/ui/compose/images/interop-keyboard.gif?authuser=2&hl=fa)
پشتیبانی درج برای مواد 3 کامپوننت
برای سهولت استفاده، بسیاری از مواد داخلی 3 composable ( androidx.compose.material3
) بر اساس نحوه قرارگیری اجزای سازنده در برنامه شما با توجه به مشخصات Material، خود به کار میروند.
مواد ترکیبی هندلینگ داخلی
در زیر لیستی از اجزای متریال است که به طور خودکار inset ها را مدیریت می کنند.
نوارهای برنامه
-
TopAppBar
/SmallTopAppBar
/CenterAlignedTopAppBar
/MediumTopAppBar
/LargeTopAppBar
: دو طرف بالا و افقی نوارهای سیستم را به عنوان بالشتک اعمال می کند زیرا در بالای پنجره استفاده می شود. -
BottomAppBar
: دو طرف پایین و افقی نوارهای سیستم را به عنوان بالشتک اعمال می کند.
ظروف محتوا
-
ModalDrawerSheet
/DismissibleDrawerSheet
/PermanentDrawerSheet
(محتوا در یک کشوی ناوبری معین): ورودی های عمودی و شروع را به محتوا اعمال می کند. -
ModalBottomSheet
: ورودی های پایینی را اعمال می کند. -
NavigationBar
: ورودی های پایین و افقی را اعمال می کند. -
NavigationRail
: ورودی های عمودی و شروع را اعمال می کند.
داربست
به طور پیشفرض، Scaffold
ورودیهایی را بهعنوان پارامتر paddingValues
برای مصرف و استفاده شما فراهم میکند. Scaffold
در داخل محتوا را اعمال نمی کند. این مسئولیت با شماست به عنوان مثال، برای مصرف این inset ها با LazyColumn
در داخل یک Scaffold
:
Scaffold { innerPadding -> // innerPadding contains inset information for you to use and apply LazyColumn( // consume insets as scaffold doesn't do it by default modifier = Modifier.consumeWindowInsets(innerPadding), contentPadding = innerPadding ) { items(count = 100) { Box( Modifier .fillMaxWidth() .height(50.dp) .background(colors[it % colors.size]) ) } } }
درج های پیش فرض را لغو کنید
میتوانید پارامتر windowInsets
به composable تغییر دهید تا رفتار composable را پیکربندی کنید. این پارامتر می تواند نوع دیگری از درج پنجره باشد که به جای آن اعمال می شود، یا با عبور دادن یک نمونه خالی غیرفعال می شود: WindowInsets(0, 0, 0, 0)
.
به عنوان مثال، برای غیرفعال کردن مدیریت inset در LargeTopAppBar
، پارامتر windowInsets
را روی یک نمونه خالی تنظیم کنید:
LargeTopAppBar( windowInsets = WindowInsets(0, 0, 0, 0), title = { Text("Hi") } )
با ورودی های سیستم View تعامل داشته باشید
زمانی که صفحه نمایش شما دارای هر دو کد Views و Compose در یک سلسله مراتب است، ممکن است لازم باشد که ورودی های پیش فرض را لغو کنید. در این مورد، شما باید به صراحت بگویید که در کدام یک از اینست ها باید مصرف کرد و کدام یک باید آنها را نادیده گرفت.
به عنوان مثال، اگر بیرونیترین طرحبندی شما یک طرحبندی Android View است، باید ورودیهای موجود در سیستم View را مصرف کنید و آنها را برای Compose نادیده بگیرید. از طرف دیگر، اگر بیرونیترین چیدمان شما قابل ترکیب است، باید ورودیها را در Compose مصرف کنید و بر اساس آن، Composableهای AndroidView
را پاک کنید.
به طور پیشفرض، هر ComposeView
تمام ورودیها را در سطح مصرف WindowInsetsCompat
مصرف میکند. برای تغییر این رفتار پیشفرض، ComposeView.consumeWindowInsets
را روی false
تنظیم کنید.
منابع
- اکنون در اندروید - یک برنامه اندروید کاملاً کاربردی که کاملاً با Kotlin و Jetpack Compose ساخته شده است.
- اجرای لبه به لبه در Android 15 - یک کد آزمایشگاهی که از طریق اجرای لبه به لبه Android 15 عبور می کند
- 3 چیز برای بهبود تجربه برنامه Android شما: Edge to Edge، Predictive Back و Glance — یک ویدیوی YouTube که با اجرای لبه به لبه Android 15 صحبت می کند.
- لبه به لبه و درونی | نکات نوشتن - یک ویدیوی YouTube که نحوه کار با ورودیها برای کشیدن لبه به لبه را نشان میدهد
برای شما توصیه می شود
- توجه: متن پیوند زمانی که جاوا اسکریپت خاموش است نمایش داده می شود
- اجزای متریال و طرحبندی
- برای نوشتن،
CoordinatorLayout
مهاجرت کنید - ملاحظات دیگر