Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Рецепт изготовления опорной панели из материалов
В этом примере показано, как создать адаптивный макет с основной панелью и вспомогательной панелью, используя стратегию SupportingPaneSceneStrategy из библиотеки Material 3 Adaptive. Такой макет полезен для отображения дополнительного контента рядом с основным контентом на больших экранах.
Как это работает
В этом примере три пункта назначения: MainVideo , RelatedVideos и Profile .
SupportingPaneSceneStrategy
Параметр rememberSupportingPaneSceneStrategy обеспечивает логику для этой адаптивной компоновки.
Роли в панели : Каждому пункту назначения присваивается роль с использованием метаданных:
-
SupportingPaneSceneStrategy.mainPane() : Для основного содержимого. Эта панель всегда видна. -
SupportingPaneSceneStrategy.supportingPane() : Для дополнительного контента. Эта панель отображается рядом с основной панелью на больших экранах. -
SupportingPaneSceneStrategy.extraPane() : Для дополнительного контента, который может отображаться рядом с вспомогательной панелью даже на больших экранах.
Адаптивная компоновка : SupportingPaneSceneStrategy автоматически управляет компоновкой. На экранах меньшего размера отображается только основная панель. На экранах большего размера рядом с основной панелью отображается вспомогательная панель.
Назад к навигации : В этом примере BackNavigationBehavior настроено на PopUntilCurrentDestinationChange . Это означает, что при нажатии пользователем кнопки «Назад» вспомогательная панель будет закрыта, открывая основную панель под ней.
Навигация : Навигация осуществляется путем добавления и удаления пунктов назначения из стека возврата. SupportingPaneSceneStrategy отслеживает эти изменения и соответствующим образом корректирует макет.

Исследовать
Полный рецепт можно посмотреть на GitHub.
arrow_forward package com.example.nav3recipes.material.supportingpane
/*
* Copyright 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.material3.adaptive.layout.calculatePaneScaffoldDirective
import androidx.compose.material3.adaptive.navigation.BackNavigationBehavior
import androidx.compose.material3.adaptive.navigation3.SupportingPaneSceneStrategy
import androidx.compose.material3.adaptive.navigation3.rememberSupportingPaneSceneStrategy
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.dropUnlessResumed
import androidx.navigation3.runtime.NavKey
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.ui.NavDisplay
import com.example.nav3recipes.content.ContentBlue
import com.example.nav3recipes.content.ContentGreen
import com.example.nav3recipes.content.ContentRed
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
import kotlinx.serialization.Serializable
@Serializable
private object MainVideo : NavKey
@Serializable
private data object RelatedVideos : NavKey
@Serializable
private data object Profile : NavKey
class MaterialSupportingPaneActivity : ComponentActivity() {
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
setEdgeToEdgeConfig()
super.onCreate(savedInstanceState)
setContent {
val backStack = rememberNavBackStack(MainVideo)
// Override the defaults so that there isn't a horizontal or vertical space between the panes.
// See b/444438086
val windowAdaptiveInfo = currentWindowAdaptiveInfoV2()
val directive = remember(windowAdaptiveInfo) {
calculatePaneScaffoldDirective(windowAdaptiveInfo)
.copy(horizontalPartitionSpacerSize = 0.dp, verticalPartitionSpacerSize = 0.dp)
}
// Override the defaults so that the supporting pane can be dismissed by pressing back.
// See b/445826749
val supportingPaneStrategy = rememberSupportingPaneSceneStrategy<NavKey>(
backNavigationBehavior = BackNavigationBehavior.PopUntilCurrentDestinationChange,
directive = directive
)
NavDisplay(
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
sceneStrategies = listOf(supportingPaneStrategy),
entryProvider = entryProvider {
entry<MainVideo>(
metadata = SupportingPaneSceneStrategy.mainPane()
) {
ContentRed("Video content") {
Button(onClick = dropUnlessResumed {
backStack.add(RelatedVideos)
}) {
Text("View related videos")
}
}
}
entry<RelatedVideos>(
metadata = SupportingPaneSceneStrategy.supportingPane()
) {
ContentBlue("Related videos") {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Button(onClick = dropUnlessResumed {
backStack.add(Profile)
}) {
Text("View profile")
}
}
}
}
entry<Profile>(
metadata = SupportingPaneSceneStrategy.extraPane()
) {
ContentGreen("Profile")
}
}
)
}
}
}
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2026-05-09 UTC.
[[["Прост для понимания","easyToUnderstand","thumb-up"],["Помог мне решить мою проблему","solvedMyProblem","thumb-up"],["Другое","otherUp","thumb-up"]],[["Отсутствует нужная мне информация","missingTheInformationINeed","thumb-down"],["Слишком сложен/слишком много шагов","tooComplicatedTooManySteps","thumb-down"],["Устарел","outOfDate","thumb-down"],["Проблема с переводом текста","translationIssue","thumb-down"],["Проблемы образцов/кода","samplesCodeIssue","thumb-down"],["Другое","otherDown","thumb-down"]],["Последнее обновление: 2026-05-09 UTC."],[],[]]