我有带多个菜单项的导航抽屉.当我点击任何项目时,它会被选中(收件箱),并带有突出显示的 colored颜色 .之后,如果我点击一些其他项目(标记的邮件),它也会以突出显示的 colored颜色 被选中.但之前 Select 的(收件箱)应该被清除(突出显示的 colored颜色 应该消失).

Only one item should be shown as Highlighted at a time . In my case both items are being highlighted as selected .ScreenShot

@Composable
fun DrawerItem(
  folderItem: NewFolderTableData,
  index: Int,
  navigationState: DrawerState,
  submenuList: ImmutableList<NewFolderTableData> = 
  emptyList<NewFolderTableData>().toImmutableList(),
  onMenuClick: (String)->Unit
) {

  val scope = rememberCoroutineScope()
  var selectedItemIndex by rememberSaveable {
    mutableStateOf("")
  }

  var showMoreSubMenu by rememberSaveable {
    mutableStateOf(false)
  }

  var showInboxSubMenu by rememberSaveable {
    mutableStateOf(false)
  }

  val title = if (folderItem.foldername == Const.MailFolder.TYPE_FOLDER_MAIL_SHOW_MORE) {
    if (!showMoreSubMenu) {
        Const.MailFolder.TYPE_FOLDER_MAIL_SHOW_MORE
    } else {
        Const.MailFolder.TYPE_FOLDER_MAIL_HIDE_MORE
    }
  } else {
    folderItem.foldername
  }

  NavigationDrawerItem(label = {
    Text(text = title)
  }, selected = title == selectedItemIndex, onClick = {
    onMenuClick(folderItem.foldername)
    if (folderItem.foldername == Const.MailFolder.TYPE_FOLDER_MAIL_SHOW_MORE) {
        showMoreSubMenu = !showMoreSubMenu
    } else {
        selectedItemIndex = title
        scope.launch {
            navigationState.close()
        }
    }
  }, icon = {
    val iconId = getFolderIcons(folderItem.foldername)
    if (iconId != -1) {
        Image(
            painterResource(id = iconId),
            contentDescription = folderItem.foldername
        )
    }
}, badge = {
    if (folderItem.foldername.equals(
            Const.MailFolder.TYPE_FOLDER_MAIL_SHOW_MORE,
            ignoreCase = true
        )
    ) {
        if (!showMoreSubMenu) {
            SetRightIcon(vector = Icons.Outlined.KeyboardArrowDown, foldername = folderItem.foldername){
            }
        } else {
            SetRightIcon(vector = Icons.Outlined.KeyboardArrowUp, foldername = folderItem.foldername){
            }
        }
    } else if (folderItem.foldername.equals(
            Const.MailFolder.TYPE_FOLDER_MAIL_INBOX,
            ignoreCase = true
        ) && submenuList.isNotEmpty()
    ) {
        if(!showInboxSubMenu){
            SetRightIcon(vector = Icons.Outlined.KeyboardArrowDown, foldername = folderItem.foldername){
                showInboxSubMenu = !showInboxSubMenu
            }
        }else{
            SetRightIcon(vector = Icons.Outlined.KeyboardArrowUp, foldername = folderItem.foldername){
                showInboxSubMenu = !showInboxSubMenu
            }
        }

    } else if (folderItem.foldername.equals(
            Const.MailFolder.TYPE_FOLDER_MAIL_TRASH,
            ignoreCase = true
        ) || folderItem.foldername.equals(
            Const.MailFolder.TYPE_FOLDER_MAIL_JUNK, ignoreCase = true
        )
    ) {
        SetRightIcon(vector = Icons.Filled.Delete, foldername = folderItem.foldername){
        }
    }else if(folderItem.foldername.equals(Const.MailFolder.TYPE_FOLDER_MAIL_ADD, ignoreCase = true)){
        SetRightIcon(vector = Icons.Filled.Add, foldername = folderItem.foldername){
            
        }
    }

  }, modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding)


  )

  AnimatedVisibility(visible = showMoreSubMenu || showInboxSubMenu) {
    DrawSubMenu(subList = submenuList, navigationState)
  } 
}

推荐答案

按照您现在的实现方式,每个DrawerItem都有自己的selectedItemIndex.一旦您点击该项目,它将被高亮显示.但是,单击一个DrawerItem不会影响所有其他DrawerItem的本地selectedItemIndex.

因此,您必须将 Select 逻辑移动到父Composable中.当您单击DrawerItem时,会更新父Composable中的选定索引.
您没有提供任何代码,但我将提供一个通用示例:

// move this declaration from DrawerItem into here
var selectedItemIndex by rememberSaveable {
    mutableStateOf("")
}

ModalNavigationDrawer(
    drawerContent = {
        ModalDrawerSheet {
            Text("My Drawer", modifier = Modifier.padding(16.dp))
            Divider()
            DrawerItem(
                selectedItemIndex = selectedItemIndex,
                updateSelectedItemIndex = { newItemIndex ->
                    selectedItemIndex = newItemIndex
                },
                //... other parameters
            )
            // ...other DrawerItem Composables
        }
    }
) {
    // Screen content
}

现在,按如下方式更新您的DrawerItem Composable的签名:

@Composable
fun DrawerItem(
  selectedItemIndex: String,
  updateSelectedItemIndex: (String) -> Unit,
  // ... other parameters
) {

    //..
    onClick = {
        onMenuClick(folderItem.foldername)
        if (folderItem.foldername == Const.MailFolder.TYPE_FOLDER_MAIL_SHOW_MORE) {
            showMoreSubMenu = !showMoreSubMenu
        } else {
            updateSelectedItemIndex(title)  // invoke callback function to update selection in parent
            scope.launch {
                navigationState.close()
            }
        }
    },
    //...
}

Android相关问答推荐

我遇到了一个HashMaps对象没有存储在Firebase数据库中的问题.HashMap的一个对象put方法未被存储

将Any强制转换为Integer将从API返回NullPointerException

合成 colored颜色 的GSON反序列化

译码BLE血糖仪特征值

Yarn 机器人导致活动未找到,但Gradlew Run工作正常

无法将项目添加到文件室数据库

如何在Android Jetpack Compose中找到我的手机屏幕一行有多少个单词

对支持哪些数据存储区方法感到困惑

为什么柱子的高度不都一样?

AndroidX Media3 迁移指南

为一组闪烁的可组合项制作动画,控制同步/定时

如何用jetpack compose实现垂直李克特量表

Android CompanionDeviceManager 永远找不到任何附近的蓝牙设备

如何将一个 Composable 作为其参数传递给另一个 Composable 并在 Jetpack Compose 中显示/运行它

Jetpack 将 Grid 与基于大小的自适应列数组合在一起

观察软键盘可见性,打开/关闭 Jetpack Compose

如何在 Jetpack Compose 中添加多个标签

java.lang.String 类型的值 Forbidden 无法转换为 JSONObject

操作系统会终止已启动的服务并调用Service.onDestroy吗?

如何让用户与任意应用程序共享文件?