Я переношу свои XML-макеты Android в Compose и столкнулся с проблемой при попытке реализовать раскрывающееся меню в Compose, которое поддерживает следующую XML-версию раскрывающегося меню.
<?xml version = "1.0" encoding = "utf-8"?>
<menu xmlns:android = "http://schemas.android.com/apk/res/android">
<item android:title = "@string/my_title" android:enabled = "false" />
<group android:id = "@+id/my_group" android:checkableBehavior = "single">
<item
android:id = "@+id/my_allocate"
android:icon = "@drawable/my_allocate"
android:title = "@string/context_menu_allocate" />
<item
android:id = "@+id/my_delete"
android:icon = "@drawable/my_delete"
android:title = "@string/context_menu_delete" />
<item
android:id = "@+id/my_context"
android:icon = "@drawable/my_context"
android:title = "@string/context_menu" />
</group>
</menu>
возможно ли это в композиции?
почему нет androidx.compose.material3.DropdownMenu
&
androidx.compose.material3.DropdownMenuItem
поддерживать группы знакомств
см. этот вопрос, в котором есть GIF, показывающий один выбираемый элемент в группе stackoverflow.com/questions/34946231/…
также этот пример из документов Google Developer.android.com/develop/ui/views/comComponents/…
Вы можете сделать что-то вроде этого:
data class MenuItem(
val name: String,
val icon: ImageVector,
val selectedIcon: ImageVector,
val selected: Boolean = false
)
@Composable
fun Menu() {
val menuItems = remember {
mutableStateListOf(
listOf(
MenuItem(
name = "Home",
icon = Icons.Outlined.Home,
selectedIcon = Icons.Filled.Home,
selected = false
),
MenuItem(
name = "Favorites",
icon = Icons.Outlined.FavoriteBorder,
selectedIcon = Icons.Filled.Favorite,
selected = false
)
),
listOf(
MenuItem(
name = "Home",
icon = Icons.Outlined.Home,
selectedIcon = Icons.Filled.Home,
selected = false
),
MenuItem(
name = "Favorites",
icon = Icons.Outlined.FavoriteBorder,
selectedIcon = Icons.Filled.Favorite,
selected = false
)
)
)
}
val onClick = { groupId: Int, selectedItemIndex: Int ->
val newGroup: MutableList<MenuItem> = mutableListOf()
menuItems[groupId].forEachIndexed { index, item ->
newGroup.add(item.copy(selected = index == selectedItemIndex))
}
menuItems[groupId] = newGroup
}
DropdownMenu(expanded = true, onDismissRequest = { }) {
menuItems.forEachIndexed { groupIndex, group ->
group.forEachIndexed { index, item ->
DropdownMenuItem(
text = { Text(text = item.name) },
onClick = { onClick(groupIndex, index) },
leadingIcon = {
Icon(
imageVector = if (item.selected) item.selectedIcon else item.icon,
contentDescription = item.name
)
},
trailingIcon = {
RadioButton(
selected = item.selected,
onClick = { onClick(groupIndex, index) }
)
}
)
}
if (groupIndex < menuItems.size - 1) {
HorizontalDivider()
}
}
}
}
Вот результат:
Этот код создает представление меню с ожидаемым поведением. Вы можете использовать ту же логику для создания бокового меню или чего-то еще.
отличная работа, я не думал использовать Compose RadioButton для возможности проверки. дает мне представление о возможности поддержки отдельных и нескольких групповых проверяемых элементов с помощью CheckBox.
Не могли бы вы поделиться изображением того, как должен выглядеть результат?