代码之家  ›  专栏  ›  技术社区  ›  Murilo

Jetpack编写导航栏项目图标

  •  1
  • Murilo  · 技术社区  · 7 月前

    我在Jetpack Compose中使用NavigationBar并为每个项目定义图标,其中选定的项目应显示一个填充的图标,未选定的项目则应显示默认图标。但是,即使未选择项目,也始终应用所选图标。

    以下是我的实现:

    @Composable
    fun MyNavBar() {
        var selectedItemIndex by rememberSaveable { mutableIntStateOf(0) }
        val itemsBarList = listOf(
            BottomNavigationItem(
                selectedIcon = Icons.Filled.Group,
                unselectedIcon = Icons.Default.Group,
            ),
            BottomNavigationItem(
                selectedIcon = Icons.Filled.Person,
                unselectedIcon = Icons.Default.Person,
            ),
            BottomNavigationItem(
                selectedIcon = Icons.Filled.Settings,
                unselectedIcon = Icons.Default.Settings,
            ),
        )
    
        NavigationBar {
            itemsBarList.forEachIndexed { index, item ->
                Log.i("HomePager", "index: $index , selectedItemIndex: $selectedItemIndex")
                NavigationBarItem(
                    selected = index == selectedItemIndex,
                    onClick = {
                        selectedItemIndex = index
                    },
                    icon = {
                        Icon(
                            imageVector = if (index == selectedItemIndex) item.selectedIcon else item.unselectedIcon,
                            contentDescription = "",
                        )
                    },
                    alwaysShowLabel = true,
                )
            }
        }
    }
    

    BottomNavigationItem数据类定义为:

    data class BottomNavigationItem(
        val selectedIcon: ImageVector,
        val unselectedIcon: ImageVector,
    )
    

    每当我选择一个新项目时,selectedItemIndex都会正确更新,但索引变量似乎总是以2结尾。因此,所选图标将应用于所有项目,而不仅仅是所选项目。

    日志:

    //here, i selected friends (index 0 on the list)
    I  index: 0 , selectedItemIndex: 0
    I  index: 1 , selectedItemIndex: 0
    I  index: 2 , selectedItemIndex: 0
    //changed to profile (index 1 on the list)
    I  index: 0 , selectedItemIndex: 1
    I  index: 1 , selectedItemIndex: 1
    I  index: 2 , selectedItemIndex: 1
    

    即使selectedItemIndex是正确的,索引似乎总是以2结尾,影响所有项目及其各自的图标,我不知道为什么会发生这种情况。如有任何帮助,不胜感激。谢谢!

    编辑:此导航栏与寻呼机一起使用,允许用户通过点击底部导航项或左右滑动进行导航。然而,由于这个问题似乎与项目的索引方式有关,并且无论我是通过导航栏选择项目还是在寻呼机中滑动,都会发生这个问题,因此我最初没有在代码段中包含寻呼机。正如论坛指南所建议的那样 minimal reproducible example ,我只关注导航栏,因为它本身显然就足以重现这个问题。

    1 回复  |  直到 7 月前
        1
  •  1
  •   tyg    7 月前

    虽然我不明白你所说的“ 索引变量似乎总是以2结尾 “(因为日志清楚地表明事实并非如此),无论选择状态如何,你都会看到相同的图标的原因是因为你实际上 使用 相同的图标。

    例如,图标

    BottomNavigationItem(
        selectedIcon = Icons.Filled.Group,
        unselectedIcon = Icons.Default.Group,
    )
    

    是一样的,因为 Icons.Default 内部定义为:

    val Default = Filled
    

    因此,在这两种情况下,图标都是相同的 Icons.Filled.Group 将采取。

    确保你实际使用 不同的 图标,例如“大纲”变体:

    BottomNavigationItem(
        selectedIcon = Icons.Filled.Group,
        unselectedIcon = Icons.Outlined.Group,
    )