android - 在 Jetpack Compose 中创建 "nested"菜单的更好或更简单的方法是什么?

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

因此,在 XML 中,您可以像这样构造菜单项并嵌套它们。
xml menu structure

但是在jetpack compose中,我无法弄清楚这是如何工作的。
我已经从 here 阅读并构建了一个简单的下拉菜单.但是尝试在 jetpack compose 中做与 XML 相同的事情并没有多大意义。菜单是独立创建的。我正在寻找比这更简单更好的东西。
jetpack-compose menu

最佳答案

这样的事情怎么样?
为您的主菜单创建一个可组合的,为您的嵌套菜单创建一个。
主菜单可组合

@Composable
fun MainMenu(
    menuSelection: MutableState<MenuSelection>,
    expandedMain: MutableState<Boolean>,
    expandedNested: MutableState<Boolean>
) {
    DropdownMenu(
        expanded = expandedMain.value,
        onDismissRequest = { expandedMain.value = false },
    ) {
        DropdownMenuItem(
            onClick = {
                expandedMain.value = false // hide main menu
                expandedNested.value = true // show nested menu
                menuSelection.value = MenuSelection.NESTED
            }
        ) {
            Text("Nested Options \u25B6")
        }

        Divider()

        DropdownMenuItem(
            onClick = {
                // close main menu
                expandedMain.value = false
                menuSelection.value = MenuSelection.SETTINGS
            }
        ) {
            Text("Settings")
        }

        Divider()

        DropdownMenuItem(
            onClick = {
                // close main menu
                expandedMain.value = false
                menuSelection.value = MenuSelection.ABOUT
            }
        ) {
            Text("About")
        }
    }
}
嵌套菜单可组合
@Composable
fun NestedMenu(
    expandedNested: MutableState<Boolean>,
    nestedMenuSelection: MutableState<NestedMenuSelection>
) {
    DropdownMenu(
        expanded = expandedNested.value,
        onDismissRequest = { expandedNested.value = false }
    ) {
        DropdownMenuItem(
            onClick = {
                // close nested menu
                expandedNested.value = false
                nestedMenuSelection.value = NestedMenuSelection.FIRST
            }
        ) {
            Text("First")
        }
        DropdownMenuItem(
            onClick = {
                // close nested menu
                expandedNested.value = false
                nestedMenuSelection.value = NestedMenuSelection.SECOND
            }
        ) {
            Text("Second")
        }
    }
}
然后将它们放在可组合的主下拉菜单中。
顶栏可组合
@Composable
fun TopAppBarDropdownMenu(
    menuSelection: MutableState<MenuSelection>,
    nestedMenuSelection: MutableState<NestedMenuSelection>
) {

    val expandedMain = remember { mutableStateOf(false) }
    val expandedNested = remember { mutableStateOf(false) }

    // Three Dot icon
    Box(
        Modifier
            .wrapContentSize(Alignment.TopEnd)
    ) {
        IconButton(
            onClick = {
                // Expand the main menu on three dots icon click
                // and hide the nested menu. 
                expandedMain.value = true
                expandedNested.value = false
            }
        ) {
            Icon(
                Icons.Filled.MoreVert,
                contentDescription = "More Menu"
            )
        }
    }

    MainMenu(
        menuSelection = menuSelection,
        expandedMain = expandedMain,
        expandedNested = expandedNested
    )
    NestedMenu(
        expandedNested = expandedNested,
        nestedMenuSelection = nestedMenuSelection
    )

}
menuSelectionnestedMenuSelection TopAppBarDropdownMenu的参数将允许在 TopAppBarDropdownMenu 中执行操作主机取决于从菜单中激活的状态。像这样的东西:
@Composable
fun MainScreen(
    /* some params */
) {
    
    val menuSelection = remember { mutableStateOf(MenuSelection.NONE) }
    val nestedMenuSelection = remember { mutableStateOf(NestedMenuSelection.DEFAULT) }
    
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(text = stringResource(R.string.app_name)) },
                actions = {
                    TopAppBarDropdownMenu(
                        menuSelection = menuSelection,
                        nestedMenuSelection= nestedMenuSelection
                    )
                }
            )
        }
    )
}
不确定这是不是“正确”的方法,但它对我有用。
您可以通过创建 NestedMenu 来简化嵌套菜单的实例化。可与更多参数组合,这将使其更易于重用。请记住 Material Design guidelines recommend using Cascading Menus only on desktop .

关于android - 在 Jetpack Compose 中创建 "nested"菜单的更好或更简单的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69456367/

相关文章:

java - RecyclerView 能否与其余 fragment 布局一起滚动?

android - Kotlin - 如何在 Handler 中传递一个 Runnable

Android Jetpack Compose 闪烁图像克隆

android - 如何在 Composable 中使用示例数据?

java - 线性布局发现意外的命名空间前缀 "xmlns"

android - 使用AsyncTask在daimajia-AndroidImageSlider中加载两个以上的图片与jsonData

java - 使用正则表达式从字符串中提取手机号码

android - Android Studio Canary 中的 Kotlin Android 扩展错误

oop - Kotlin:如何将作为集合的类变量重写为子类型的集合

android - 如何使用jetpack compose为卡片 View 添加边框