android - 如何使用具有多个 backstack 的导航组件实现具有相同行为的 3 个选项卡组合导航应用程序?

标签 android kotlin android-jetpack-compose android-jetpack-navigation

我搜索并实现了 Jetpack 撰写示例。我也实现了以下导航 Codelab 示例。

https://github.com/googlecodelabs/android-compose-codelabs/tree/main/NavigationCodelab

我这里有个问题。当我单击选项卡上的某些内容时,我们导航到可组合项并将该可组合项放入堆栈中。当我点击返回时,会显示之前的可组合项。

在我的导航组件应用程序中,不使用 jetpack compose,例如,有 3 个选项卡:主页、收藏夹、设置。我依次单击“收藏夹”、“设置”、“主页”、“收藏夹”、“设置”。当我按下后退按钮时,会显示主页 fragment 。然后,当我再次按下后退按钮时,应用程序将关闭。

在我的撰写导航应用程序中,我执行相同的操作(单击“收藏夹”、“设置”、“主页”、“收藏夹”、“设置”)。为了关闭应用程序,我需要按后退按钮 5 次。这是我的问题。我希望导航组件具有相同的行为。我希望当我单击后退按钮时应显示起始目标 fragment ,然后,当我再次单击后退按钮时,应用程序应关闭。如何做到这一点?

最佳答案

//tab密封类

typealias ComposableFun = @Composable () -> Unit

sealed class TabsItem(val title: String, val screen: ComposableFun){
    object HomeScrenn: TabsItem(title = "Home", { Home() })
    object FavScreen: TabsItem(title = "fav", { fav()})
    object SetingScreen: TabsItem(title = "Setting"{Setting()}, 
}

//您可以在此处添加标签

@Composable
fun SectionTabScreen() {

    val tabs = listOf(
        TabsItem.Home,
        TabsItem.Fav,
        TabsItem.Setting,
        
    )

    val pagerState = rememberPagerState()

    Scaffold{
        Column {
            Tabs(tabs = tabs, pagerState = pagerState)
            TabsContent(tabs = tabs, pagerState = pagerState)
        }
    }
}

@Composable
fun Tabs(tabs: List<TabsItem>, pagerState: PagerState) {
    val scope = rememberCoroutineScope()
    // OR ScrollableTabRow()
    ScrollableTabRow(
        modifier = Modifier.fillMaxWidth(),
        selectedTabIndex = pagerState.currentPage,
        backgroundColor = MaterialTheme.colors.background,
//        contentColor = Color.White,
        edgePadding = 0.dp,
        indicator = { tabPositions ->
            TabRowDefaults.Indicator(
                Modifier.pagerTabIndicatorOffset(pagerState, tabPositions)
            )
        }){

        tabs.forEachIndexed { index, tab ->
            // OR LeadingIconTab()

            Tab(
                text = {
                    Text(
                        text = tab.title,
                        fontSize = MaterialTheme.typography.h6.fontSize,
                        )},
                selected = pagerState.currentPage == index,
                onClick = {
                    scope.launch {
                        pagerState.animateScrollToPage(index)
                    }
                },
            )
        }
    }
}

@Composable
fun TabsContent(tabs: List<TabsItem>, pagerState: PagerState) {
    HorizontalPager(state = pagerState, count = tabs.size) { page ->
        tabs[page].screen()
    }
}

关于android - 如何使用具有多个 backstack 的导航组件实现具有相同行为的 3 个选项卡组合导航应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71663467/

相关文章:

java - 如何将 iCal 文件上传到用户的日历

java - 如何用新收到的通知替换旧通知,而不是在通知托盘中创建一堆通知?

android - 等价于约束布局 0dp

android - FireBaseCloud如何启动 list 中注册的服务?

android - 在 Ionic 应用程序中使用 Vega Charts 会导致在某些设备上启动时出现运行时错误

android - Robolectric addResolveInfoForIntent 不起作用

android - LazyColumn 比垂直滚动的 Column 慢

android - Jetpack Compose 如何将特定大小的文本组件的文本或内容与左下角或右下角对齐?

android - 将 Android 客户端用于 socketIO 时出现 SocketIO 异常

android - 如何使用相同的变量从 2 个不同的类接收额外的 Intent ?