Android Создайте раскрывающееся меню с помощью android:checkableBehavior="single", аналогично меню xml

Я переношу свои 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 поддерживать группы знакомств

Не могли бы вы поделиться изображением того, как должен выглядеть результат?

Sina 23.06.2024 23:05

см. этот вопрос, в котором есть GIF, показывающий один выбираемый элемент в группе stackoverflow.com/questions/34946231/…

Hector 24.06.2024 07:25

также этот пример из документов Google Developer.android.com/develop/ui/views/comComponents/…

Hector 24.06.2024 07:26
0
3
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать что-то вроде этого:

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.

Hector 26.06.2024 07:34

Другие вопросы по теме