对话配方
此方案演示了如何以对话框形式显示目的地。
工作原理
如需将目的地显示为对话框,您需要执行以下两项操作:
-
使用
DialogSceneStrategy:创建DialogSceneStrategy的实例,并将其传递给NavDisplay可组合项的sceneStrategy形参。 -
向目的地添加元数据:对于要显示为对话框的目的地,请向其元数据添加
DialogSceneStrategy.dialog()。此操作在entry函数中完成。您还可以传递DialogProperties对象来自定义对话框的行为和外观。
在此示例中,RouteB 配置为对话框。当您从 RouteA 导航到 RouteB 时,RouteB 将显示在对话框窗口中。
您可以根据需要设置对话框内容的样式。在此配方中,内容被剪裁为圆角。
如需了解详情,请参阅有关自定义布局的官方文档。
/* * 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. */ package com.example.nav3recipes.dialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import androidx.lifecycle.compose.dropUnlessResumed import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.scene.DialogSceneStrategy import androidx.navigation3.ui.NavDisplay import com.example.nav3recipes.content.ContentBlue import com.example.nav3recipes.content.ContentGreen import com.example.nav3recipes.ui.setEdgeToEdgeConfig import kotlinx.serialization.Serializable @Serializable private data object RouteA : NavKey @Serializable private data class RouteB(val id: String) : NavKey class DialogActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { setEdgeToEdgeConfig() super.onCreate(savedInstanceState) setContent { val backStack = rememberNavBackStack(RouteA) val dialogStrategy = remember { DialogSceneStrategy<NavKey>() } NavDisplay( backStack = backStack, onBack = { backStack.removeLastOrNull() }, sceneStrategies = listOf(dialogStrategy), entryProvider = entryProvider { entry<RouteA> { ContentGreen("Welcome to Nav3") { Button(onClick = dropUnlessResumed { backStack.add(RouteB("123")) }) { Text("Click to open dialog") } } } entry<RouteB>( metadata = DialogSceneStrategy.dialog( DialogProperties(windowTitle = "Route B dialog") ) ) { key -> ContentBlue( title = "Route id: ${key.id}", modifier = Modifier.clip( shape = RoundedCornerShape(16.dp) ) ) } } ) } } }