সাপোর্টিং প্যান লেআউট ব্যবহারকারীর ফোকাস অ্যাপের মূল কন্টেন্টের উপর রাখে এবং প্রাসঙ্গিক সাপোর্টিং তথ্য প্রদর্শন করে। উদাহরণস্বরূপ, প্রধান প্যানটি একটি সিনেমা সম্পর্কে বিশদ বিবরণ দেখাতে পারে, যখন সাপোর্টিং প্যানটি একই ধরণের সিনেমা, একই পরিচালকের সিনেমা বা একই অভিনেতাদের নিয়ে তৈরি কাজ তালিকাভুক্ত করে।
আরও বিস্তারিত জানার জন্য, ম্যাটেরিয়াল 3 সাপোর্টিং প্যান নির্দেশিকা দেখুন।
একটি স্ক্যাফোল্ড সহ একটি সহায়ক ফলক স্থাপন করুন
NavigableSupportingPaneScaffold হল একটি কম্পোজেবল যা Jetpack Compose-এ একটি সাপোর্টিং প্যান লেআউট বাস্তবায়নকে সহজ করে তোলে। এটি SupportingPaneScaffold মোড়ানো হয় এবং বিল্ট-ইন নেভিগেশন এবং ভবিষ্যদ্বাণীমূলক ব্যাক হ্যান্ডলিং যোগ করে।
একটি সাপোর্টিং প্যান স্ক্যাফোল্ড সর্বাধিক তিনটি প্যান সমর্থন করে:
- প্রধান ফলক : প্রাথমিক বিষয়বস্তু প্রদর্শন করে।
- সাপোর্টিং প্যান : প্রধান প্যানের সাথে সম্পর্কিত অতিরিক্ত প্রসঙ্গ বা সরঞ্জাম সরবরাহ করে।
- অতিরিক্ত ফলক (ঐচ্ছিক) : প্রয়োজনে সম্পূরক সামগ্রীর জন্য ব্যবহৃত।
জানালার আকারের উপর ভিত্তি করে স্ক্যাফোল্ডটি অভিযোজিত হয়:
- বড় জানালাগুলিতে , প্রধান এবং সহায়ক প্যানেলগুলি পাশাপাশি দেখা যায়।
ছোট উইন্ডোতে , একবারে কেবল একটি প্যান দৃশ্যমান হয়, ব্যবহারকারীরা নেভিগেট করার সাথে সাথে পরিবর্তন করে।

চিত্র ১. সাপোর্টিং প্যান লেআউট।
নির্ভরতা যোগ করুন
NavigableSupportingPaneScaffold হল Material 3 অ্যাডাপ্টিভ লেআউট লাইব্রেরির অংশ।
আপনার অ্যাপ বা মডিউলের build.gradle ফাইলে নিম্নলিখিত তিনটি সম্পর্কিত নির্ভরতা যোগ করুন:
কোটলিন
implementation("androidx.compose.material3.adaptive:adaptive")
implementation("androidx.compose.material3.adaptive:adaptive-layout")
implementation("androidx.compose.material3.adaptive:adaptive-navigation")
খাঁজকাটা
implementation 'androidx.compose.material3.adaptive:adaptive'
implementation 'androidx.compose.material3.adaptive:adaptive-layout'
implementation 'androidx.compose.material3.adaptive:adaptive-navigation'
অভিযোজিত : নিম্ন-স্তরের বিল্ডিং ব্লক যেমন
HingeInfoএবংPostureঅ্যাডাপটিভ-লেআউট : অ্যাডাপটিভ লেআউট যেমন
ListDetailPaneScaffoldএবংSupportingPaneScaffoldঅ্যাডাপটিভ-নেভিগেশন : প্যানের ভেতরে এবং মাঝখানে নেভিগেট করার জন্য কম্পোজেবল, সেইসাথে অ্যাডাপটিভ লেআউট যা ডিফল্টভাবে নেভিগেট সমর্থন করে যেমন
NavigableListDetailPaneScaffoldএবংNavigableSupportingPaneScaffold
নিশ্চিত করুন যে আপনার প্রকল্পে compose-material3-adaptive সংস্করণ 1.1.0-beta1 বা উচ্চতর সংস্করণ রয়েছে।
ভবিষ্যদ্বাণীমূলক ব্যাক জেসচারে অপ্ট-ইন করুন
Android 15 বা তার আগের ভার্সনে ভবিষ্যদ্বাণীমূলক ব্যাক অ্যানিমেশন সক্ষম করতে, আপনাকে ভবিষ্যদ্বাণীমূলক ব্যাক জেসচার সমর্থন করার জন্য অপ্ট-ইন করতে হবে। অপ্ট-ইন করতে, আপনার AndroidManifest.xml ফাইলের মধ্যে <application> ট্যাগ বা ব্যক্তিগত <activity> ট্যাগে android:enableOnBackInvokedCallback="true" যোগ করুন।
একবার আপনার অ্যাপটি অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬) বা তার উচ্চতর ভার্সনকে টার্গেট করলে, প্রেডিক্টিভ ব্যাক ডিফল্টরূপে সক্ষম হয়ে যায়।
একটি নেভিগেটর তৈরি করুন
ছোট উইন্ডোতে, একবারে কেবল একটি প্যান প্রদর্শিত হয়, তাই প্যানে এবং থেকে সরানোর জন্য একটি ThreePaneScaffoldNavigator ব্যবহার করুন। rememberSupportingPaneScaffoldNavigator দিয়ে নেভিগেটরের একটি উদাহরণ তৈরি করুন।
val scaffoldNavigator = rememberSupportingPaneScaffoldNavigator() val scope = rememberCoroutineScope()
ন্যাভিগেটরটিকে স্ক্যাফোল্ডে নিয়ে যান।
স্ক্যাফোল্ডটির জন্য একটি ThreePaneScaffoldNavigator প্রয়োজন যা স্ক্যাফোল্ডের অবস্থা, ThreePaneScaffoldValue এবং একটি PaneScaffoldDirective প্রতিনিধিত্ব করে এমন একটি ইন্টারফেস।
NavigableSupportingPaneScaffold( navigator = scaffoldNavigator, mainPane = { /*...*/ }, supportingPane = { /*...*/ }, )
প্রধান ফলক এবং সাপোর্টিং ফলক হল আপনার কন্টেন্ট ধারণকারী কম্পোজেবল। নেভিগেশনের সময় ডিফল্ট ফলক অ্যানিমেশন প্রয়োগ করতে AnimatedPane ব্যবহার করুন। সাপোর্টিং ফলকটি লুকানো আছে কিনা তা পরীক্ষা করতে স্ক্যাফোল্ড মান ব্যবহার করুন; যদি তাই হয়, তাহলে সাপোর্টিং ফলকটি প্রদর্শন করতে navigateTo(SupportingPaneScaffoldRole.Supporting) কল করে একটি বোতাম প্রদর্শন করুন।
বড় স্ক্রিনের জন্য, BackNavigationBehavior.PopUntilScaffoldValueChange ধ্রুবকের মধ্যে দিয়ে সাপোর্টিং প্যানটি বাতিল করার জন্য ThreePaneScaffoldNavigator.navigateBack() পদ্ধতি ব্যবহার করুন। এই পদ্ধতিটি কল করলে NavigableSupportingPaneScaffold এর পুনর্গঠন বাধ্যতামূলক হয়। পুনর্গঠনের সময়, সাপোর্টিং প্যানটি দেখানো হবে কিনা তা নির্ধারণ করতে ThreePaneScaffoldNavigator.currentDestination বৈশিষ্ট্যটি পরীক্ষা করুন।
এখানে স্ক্যাফোল্ডের সম্পূর্ণ বাস্তবায়ন দেওয়া হল:
val scaffoldNavigator = rememberSupportingPaneScaffoldNavigator() val scope = rememberCoroutineScope() val backNavigationBehavior = BackNavigationBehavior.PopUntilScaffoldValueChange NavigableSupportingPaneScaffold( navigator = scaffoldNavigator, mainPane = { AnimatedPane( modifier = Modifier .safeContentPadding() .background(Color.Red) ) { if (scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting] == PaneAdaptedValue.Hidden) { Button( modifier = Modifier .wrapContentSize(), onClick = { scope.launch { scaffoldNavigator.navigateTo(SupportingPaneScaffoldRole.Supporting) } } ) { Text("Show supporting pane") } } else { Text("Supporting pane is shown") } } }, supportingPane = { AnimatedPane(modifier = Modifier.safeContentPadding()) { Column { // Allow users to dismiss the supporting pane. Use back navigation to // hide an expanded supporting pane. if (scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting] == PaneAdaptedValue.Expanded) { // Material design principles promote the usage of a right-aligned // close (X) button. IconButton( modifier = Modifier.align(Alignment.End).padding(16.dp), onClick = { scope.launch { scaffoldNavigator.navigateBack(backNavigationBehavior) } } ) { Icon(Icons.Default.Close, contentDescription = "Close") } } Text("Supporting pane") } } } )
প্যান কম্পোজেবল এক্সট্র্যাক্ট করুন
একটি SupportingPaneScaffold এর পৃথক প্যানগুলিকে তাদের নিজস্ব কম্পোজেবলে এক্সট্র্যাক্ট করুন যাতে সেগুলি পুনঃব্যবহারযোগ্য এবং পরীক্ষাযোগ্য হয়। ডিফল্ট অ্যানিমেশনগুলি চাইলে AnimatedPane অ্যাক্সেস করতে ThreePaneScaffoldScope ব্যবহার করুন:
@OptIn(ExperimentalMaterial3AdaptiveApi::class) @Composable fun ThreePaneScaffoldPaneScope.MainPane( shouldShowSupportingPaneButton: Boolean, onNavigateToSupportingPane: () -> Unit, modifier: Modifier = Modifier, ) { AnimatedPane( modifier = modifier.safeContentPadding() ) { // Main pane content if (shouldShowSupportingPaneButton) { Button(onClick = onNavigateToSupportingPane) { Text("Show supporting pane") } } else { Text("Supporting pane is shown") } } } @OptIn(ExperimentalMaterial3AdaptiveApi::class) @Composable fun ThreePaneScaffoldPaneScope.SupportingPane( scaffoldNavigator: ThreePaneScaffoldNavigator<Any>, modifier: Modifier = Modifier, backNavigationBehavior: BackNavigationBehavior = BackNavigationBehavior.PopUntilScaffoldValueChange, ) { val scope = rememberCoroutineScope() AnimatedPane(modifier = Modifier.safeContentPadding()) { Column { // Allow users to dismiss the supporting pane. Use back navigation to // hide an expanded supporting pane. if (scaffoldNavigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting] == PaneAdaptedValue.Expanded) { // Material design principles promote the usage of a right-aligned // close (X) button. IconButton( modifier = modifier.align(Alignment.End).padding(16.dp), onClick = { scope.launch { scaffoldNavigator.navigateBack(backNavigationBehavior) } } ) { Icon(Icons.Default.Close, contentDescription = "Close") } } Text("Supporting pane") } } }
কম্পোজেবলে প্যানগুলি বের করে আনার ফলে SupportingPaneScaffold ব্যবহার সহজ হয় (পূর্ববর্তী বিভাগে স্ক্যাফোল্ডের সম্পূর্ণ বাস্তবায়নের সাথে নিম্নলিখিতগুলি তুলনা করুন):
val scaffoldNavigator = rememberSupportingPaneScaffoldNavigator() val scope = rememberCoroutineScope() NavigableSupportingPaneScaffold( navigator = scaffoldNavigator, mainPane = { MainPane( shouldShowSupportingPaneButton = scaffoldNavigator.scaffoldValue.secondary == PaneAdaptedValue.Hidden, onNavigateToSupportingPane = { scope.launch { scaffoldNavigator.navigateTo(ThreePaneScaffoldRole.Secondary) } } ) }, supportingPane = { SupportingPane(scaffoldNavigator = scaffoldNavigator) }, )
যদি আপনার স্ক্যাফোল্ডের নির্দিষ্ট দিকগুলির উপর আরও নিয়ন্ত্রণের প্রয়োজন হয়, তাহলে NavigableSupportingPaneScaffold এর পরিবর্তে SupportingPaneScaffold ব্যবহার করার কথা বিবেচনা করুন। এটি একটি PaneScaffoldDirective এবং ThreePaneScaffoldValue বা ThreePaneScaffoldState আলাদাভাবে গ্রহণ করে। এই নমনীয়তা আপনাকে প্যানের ব্যবধানের জন্য কাস্টম লজিক বাস্তবায়ন করতে এবং একসাথে কতগুলি প্যান প্রদর্শিত হবে তা নির্ধারণ করতে দেয়। আপনি ThreePaneScaffoldPredictiveBackHandler যোগ করে ভবিষ্যদ্বাণীমূলক ব্যাক সাপোর্টও সক্ষম করতে পারেন।
ThreePaneScaffoldPredictiveBackHandler যোগ করুন
একটি স্ক্যাফোল্ড নেভিগেটর ইনস্ট্যান্স গ্রহণকারী ভবিষ্যদ্বাণীমূলক ব্যাক হ্যান্ডলার সংযুক্ত করুন এবং backBehavior নির্দিষ্ট করুন। এটি নির্ধারণ করে যে ব্যাক নেভিগেশনের সময় ব্যাকস্ট্যাক থেকে গন্তব্যগুলি কীভাবে পপ করা হয়। তারপর scaffoldDirective এবং scaffoldState SupportingPaneScaffold এ পাস করুন। scaffoldNavigator.scaffoldState এ পাস করে একটি ThreePaneScaffoldState গ্রহণ করে এমন ওভারলোড ব্যবহার করুন।
SupportingPaneScaffold মধ্যে প্রধান এবং সহায়ক প্যানগুলি নির্ধারণ করুন। ডিফল্ট প্যান অ্যানিমেশনের জন্য AnimatedPane ব্যবহার করুন।
এই ধাপগুলি বাস্তবায়নের পরে, আপনার কোডটি নিম্নলিখিতগুলির মতো দেখাবে:
val scaffoldNavigator = rememberSupportingPaneScaffoldNavigator() val scope = rememberCoroutineScope() ThreePaneScaffoldPredictiveBackHandler( navigator = scaffoldNavigator, backBehavior = BackNavigationBehavior.PopUntilScaffoldValueChange ) SupportingPaneScaffold( directive = scaffoldNavigator.scaffoldDirective, scaffoldState = scaffoldNavigator.scaffoldState, mainPane = { MainPane( shouldShowSupportingPaneButton = scaffoldNavigator.scaffoldValue.secondary == PaneAdaptedValue.Hidden, onNavigateToSupportingPane = { scope.launch { scaffoldNavigator.navigateTo(ThreePaneScaffoldRole.Secondary) } } ) }, supportingPane = { SupportingPane(scaffoldNavigator = scaffoldNavigator) }, )