Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Подробный список материалов и рецепт
В этом примере показано, как создать адаптивный макет «список-детали» с помощью ListDetailSceneStrategy из библиотеки Material 3 Adaptive. Этот макет автоматически подстраивается под ширину экрана, отображая одну, две или три панели.
Как это работает
В этом примере три пункта назначения: ConversationList , ConversationDetail и Profile .
ListDetailSceneStrategy
Ключевым элементом этого рецепта является функция rememberListDetailSceneStrategy , которая обеспечивает логику адаптивной компоновки.
Роли в панели : Каждому пункту назначения присваивается роль с использованием метаданных:
-
ListDetailSceneStrategy.listPane() : Для основного (спискового) содержимого. Эта панель всегда видна. Можно указать заполнитель, который будет отображаться в области панели сведений, если не выбрано ни одного элемента в панели сведений. -
ListDetailSceneStrategy.detailPane() : Для отображения вторичного (детального) контента. -
ListDetailSceneStrategy.extraPane() : Для дополнительного контента.
Адаптивная компоновка : ListDetailSceneStrategy автоматически управляет компоновкой. На небольших экранах одновременно отображается только одна панель. На более широких экранах панели списка и подробной информации отображаются рядом. На очень широких экранах могут отображаться все три панели: список, подробная информация и дополнительная информация.
Навигация : Навигация между панелями осуществляется путем добавления и удаления элементов из стека возврата, как обычно. ListDetailSceneStrategy отслеживает стек возврата и соответствующим образом корректирует макет.

Исследовать
Полный рецепт можно посмотреть на GitHub.
arrow_forward package com.example.nav3recipes.material.listdetail
/*
* 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.navigation3.ListDetailSceneStrategy
import androidx.compose.material3.adaptive.navigation3.rememberListDetailSceneStrategy
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.content.ContentYellow
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
import kotlinx.serialization.Serializable
@Serializable
private object ConversationList : NavKey
@Serializable
private data class ConversationDetail(val id: String) : NavKey
@Serializable
private data object Profile : NavKey
class MaterialListDetailActivity : ComponentActivity() {
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
setEdgeToEdgeConfig()
super.onCreate(savedInstanceState)
setContent {
val backStack = rememberNavBackStack(ConversationList)
// Override the defaults so that there isn't a horizontal space between the panes.
// See b/418201867
val windowAdaptiveInfo = currentWindowAdaptiveInfoV2()
val directive = remember(windowAdaptiveInfo) {
calculatePaneScaffoldDirective(windowAdaptiveInfo)
.copy(horizontalPartitionSpacerSize = 0.dp)
}
val listDetailStrategy = rememberListDetailSceneStrategy<NavKey>(directive = directive)
NavDisplay(
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
sceneStrategies = listOf(listDetailStrategy),
entryProvider = entryProvider {
entry<ConversationList>(
metadata = ListDetailSceneStrategy.listPane(
detailPlaceholder = {
ContentYellow("Choose a conversation from the list")
}
)
) {
ContentRed("Welcome to Nav3") {
Button(onClick = dropUnlessResumed {
backStack.add(ConversationDetail("ABC"))
}) {
Text("View conversation")
}
}
}
entry<ConversationDetail>(
metadata = ListDetailSceneStrategy.detailPane()
) { conversation ->
ContentBlue("Conversation ${conversation.id} ") {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Button(onClick = dropUnlessResumed {
backStack.add(Profile)
}) {
Text("View profile")
}
}
}
}
entry<Profile>(
metadata = ListDetailSceneStrategy.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."],[],[]]