如何控制 jetpack compose 中下拉菜单的 z 索引?

How do I control the z index of a drop down menu in jetpack compose?

提问人:Haikal 提问时间:11/7/2023 更新时间:11/13/2023 访问量:50

问:

我想制作一个下拉菜单以位于 OutlinedTextField 后面

我希望做这个正确的图像

这是它当前当前应用程序的样子

我尝试放置 zIndex,并更新到 androidx.compose.material3:material3:1.2.0-alpha10。我还通过将 ExposedDropDownMenu 更改为 DropDownMenu 并在 DropDownMenu 上使用 .exposedDropdownSize() 来使用宽度的解决方法

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun WalletDropDown(
    viewModel: BookViewModel,
    transactionType: TransactionType
) {
    val state by viewModel.state.collectAsState()
    ExposedDropdownMenuBox(
        expanded = state.isWalletExpanded && state.transactionType == transactionType.value,
        onExpandedChange = {
            viewModel.updateWalletExpanded(!state.isWalletExpanded)
        },
        modifier = Modifier
            .fillMaxWidth()
    ) {
        OutlinedTextField(
            value = state.wallet,
            onValueChange = {
                viewModel.updateNoteState(it)
            },
            shape = RoundedCornerShape(30.dp),
            colors = ExposedDropdownMenuDefaults.outlinedTextFieldColors(
                unfocusedBorderColor = Color.Black,
            ),
            textStyle = MaterialTheme.typography.bodyMedium.copy(
                platformStyle = PlatformTextStyle(
                    includeFontPadding = false
                )
            ),
            trailingIcon = {
                Icon(
                    painter = painterResource(id = if (state.isWalletExpanded) R.drawable.ic_arrow_drop_up else R.drawable.ic_arrow_drop_down),
                    contentDescription = "Dropdown",
                    modifier = Modifier
                        .size(24.dp)
                )
            },
            readOnly = true,
            modifier = Modifier
                .fillMaxWidth()
                .height(50.dp)
                .padding(bottom = 5.dp)
                .menuAnchor()
                .zIndex(2f)
        )
        MaterialTheme(
            shapes = MaterialTheme.shapes.copy(
                extraSmall = RoundedCornerShape(24.dp)
            )
        ) {
            DropdownMenu(
                expanded = state.isWalletExpanded && state.transactionType == transactionType.value,
                onDismissRequest = {
                    viewModel.updateWalletExpanded(false)
                },
                properties = PopupProperties(
                    focusable = true,
                    dismissOnClickOutside = true,
                    dismissOnBackPress = true
                ),
                offset = DpOffset(x = 0.dp, y = (-50).dp),
                modifier = Modifier
                    .exposedDropdownSize(true)
                    .background(Color.White)
                    .border(
                        width = 1.dp,
                        color = Color.Black,
                        shape = RoundedCornerShape(24.dp)
                    )
                    .zIndex(1f)

            ) {
                DropdownMenuItem(text = {}, onClick = {}, modifier = Modifier.height(50.dp))
                WalletDropDownItem(
                    viewModel = viewModel,
                    icon = R.drawable.bca,
                    walletName = "BCA",
                    money = "Rp 1,000,000.00"
                )
                WalletDropDownItem(
                    viewModel = viewModel,
                    icon = R.drawable.dana,
                    walletName = "Dana",
                    money = "Rp 3,000,000.00"
                )
                WalletDropDownItem(
                    viewModel = viewModel,
                    icon = R.drawable.gopay,
                    walletName = "Gopay",
                    money = "Rp 500,000.00"
                )
            }
        }
    }
}

@Composable
fun WalletDropDownItem(
    viewModel: BookViewModel,
    icon: Int,
    walletName: String,
    money: String
) {
    DropdownMenuItem(
        leadingIcon = {
            Image(
                painter = painterResource(id = icon),
                contentDescription = "wallet",
                modifier = Modifier
                    .size(24.dp)
            )
        },
        text = {
            Row(
                verticalAlignment = Alignment.CenterVertically,
                horizontalArrangement = Arrangement.SpaceBetween,
                modifier = Modifier
                    .fillMaxWidth()
            ) {
                Text(
                    text = walletName,
                    style = MaterialTheme.typography.bodyMedium
                )
                Text(
                    text = money,
                    style = MaterialTheme.typography.bodyMedium
                )
            }
        },
        onClick = {
            viewModel.updateWalletState(walletName)
            viewModel.updateWalletExpanded(false)
        },
        modifier = Modifier
            .fillMaxWidth()
            .zIndex(1f)
    )
}
Android Kotlin 下拉菜单 android-jetpack-compose

评论


答:

0赞 musclebananas 11/13/2023 #1

正如文档所说:

DropdownMenu 的行为类似于 Popup,并将使用 父布局的位置,以在屏幕上定位自身。通常 DropdownMenu 将放置在一个 Box 中,其中包含将使用的同级 作为“锚”。请注意,DropdownMenu 本身不会占用 布局中的任何空间,因为菜单显示在单独的窗口中, 在其他内容之上。

因此,它将始终绘制在其他内容之上。如果您找到一些解决方法,请分享它,我相信其他人(包括我自己)会很感激!