我DropdownMenu在 Jetpack Compose 中使用 ,但我遇到了一個問題,即很多用戶不明白選單包含更多資訊,因此他們可以滾動串列。我得到了很多支持,他們在串列中遺漏了一些東西。特別是在某些語言中,它很好地將高度與專案對齊,因此您看不到有更多專案。
有沒有辦法自動設定下拉選單的高度(無論語言如何),以便在底部顯示專案的一半,以便用戶了解他們可以滾動串列?
我使用這些修飾符創建選單:
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
modifier = Modifier.requiredSizeIn(maxHeight = 330.dp)
) {
items.forEachIndexed { index, item ->
DropdownMenuItem(onClick = {
onSelected(index, item.data)
selectedIndex = index
expanded = false
}) {
...
}
uj5u.com熱心網友回復:
我同意這是一個很好的功能,我建議您在 Compose 問題跟蹤器上創建一個功能請求。
這是現在的解決方法,您可以使用Modifier.onSizeChanged并更新您的maxHeight約束,如下所示:
@Composable
fun TestScreen(
) {
var expanded by remember { mutableStateOf(true) }
val items = List(10) { it.toString() }
val itemHeights = remember { mutableStateMapOf<Int, Int>() }
val baseHeight = 330.dp
val density = LocalDensity.current
val maxHeight = remember(itemHeights.toMap()) {
if (itemHeights.keys.toSet() != items.indices.toSet()) {
// if we don't have all heights calculated yet, return default value
return@remember baseHeight
}
val baseHeightInt = with(density) { baseHeight.toPx().toInt() }
// top bottom system padding
var sum = with(density) { DropdownMenuVerticalPadding.toPx().toInt() } * 2
for ((i, itemSize) in itemHeights.toSortedMap()) {
sum = itemSize
if (sum >= baseHeightInt) {
return@remember with(density) { (sum - itemSize / 2).toDp() }
}
}
// all items fit into base height
baseHeight
}
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false },
modifier = Modifier.requiredSizeIn(maxHeight = maxHeight)
) {
items.forEachIndexed { index, item ->
DropdownMenuItem(
onClick = {
onSelected(index, item.data)
selectedIndex = index
expanded = false
},
modifier = Modifier.onSizeChanged {
itemHeights[index] = it.height
}
) {
Text("Hello $index", modifier = Modifier.padding(30.dp))
}
}
}
}
private val DropdownMenuVerticalPadding = 8.dp
psDropdownMenuVerticalPadding是取自源代碼的 Material 常量。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/342585.html
標籤:科特林 android-jetpack-compose
上一篇:無法將反射場投射到地圖中
