下面的代码在 Android 14 上运行良好,但在 Android 15 上,工具提示的底部被截断:
红色边框的底部缺失,只有字母“g”的顶部可见。
顶部状态栏的高度好像缺失了,如何修复?代码:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
var veryLongTooltip = ""
for (i in 0..60) { // generate 60 lines
veryLongTooltip += "$i\n"
}
veryLongTooltip += "\n" + "last line aaaaaa bbbbbbb cccccc dddddd eeeeee fffffff ggggggg"
setContent {
TestTheme {
Scaffold { innerPadding ->
Column(
modifier = Modifier.padding(innerPadding),
) {
TooltipButton(tooltipText = veryLongTooltip)
}
}
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TooltipButton(tooltipText: String) {
val tooltipState = rememberTooltipState(isPersistent = true)
TooltipBox(
positionProvider = TooltipDefaults.rememberRichTooltipPositionProvider(),
tooltip = {
RichTooltip(
shape = RoundedCornerShape(5.dp),
modifier = Modifier
.border(4.dp, Color.Red, shape = RoundedCornerShape(5.dp))
) {
Text(
tooltipText,
fontSize = 18.sp,
modifier = Modifier.verticalScroll(rememberScrollState())
)
}
},
state = tooltipState
) {
val coroutine = rememberCoroutineScope()
Button(
onClick = {
coroutine.launch { tooltipState.show() }
}
) {
Text("click to show the tooltip")
}
}
}
不确定为什么会发生这种情况,我最终使用了一种解决方法将文本的最大高度限制为屏幕的 90%。
@Composable
fun Modifier.maxScreenHeight(percentage: Float): Modifier = composed {
val ctx = LocalContext.current
val density = LocalDensity.current
val maxHeight = density.run {
val screenHeightPx = ctx.resources.displayMetrics.heightPixels
screenHeightPx.toDp().value * percentage
}
this.then(
Modifier.heightIn(max = maxHeight.dp)
)
}
看起来您需要设置窗口插入,以在边缘到边缘模式下将 Activity 的内容保留在系统栏之外(Android 15 几乎需要这样做)。
这里有更多信息和来自 https://developer.android.com/develop/ui/views/layout/edge-to-edge#cutout-insets
的 Kotlin 示例ViewCompat.setOnApplyWindowInsetsListener(binding.recyclerView) { v, insets ->
val bars = insets.getInsets(
WindowInsetsCompat.Type.systemBars()
or WindowInsetsCompat.Type.displayCutout()
)
v.updatePadding(
left = bars.left,
top = bars.top,
right = bars.right,
bottom = bars.bottom,
)
WindowInsetsCompat.CONSUMED
}
在实践中,您必须决定在哪个视图上设置插图。您可以将其应用于整个 Activity 或其中的某些部分,而不是此示例的 RecyclerView。