You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 15 Tooltip超出屏幕高度时底部截断问题及临时解决

Android 15中RichTooltip底部截断问题

问题现象

在Android 14及以下版本运行正常的RichTooltip,在Android 15中出现底部截断:红边框底部缺失,最后一行文本的字母'g'仅显示顶部部分,推测是Tooltip高度计算未考虑顶部状态栏高度导致。

复现代码

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()

        var veryLongTooltip = ""
        for (i in 0..60) { // 生成60行文本
            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")
        }
    }
}

临时修复方案

通过限制Tooltip内文本区域的最大高度为屏幕高度的90%,避免内容超出可显示范围。实现一个Modifier扩展函数:

@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)
    )
}

使用时,在Text的Modifier中添加该限制:

Text(
    tooltipText,
    fontSize = 18.sp,
    modifier = Modifier
        .verticalScroll(rememberScrollState())
        .maxScreenHeight(0.9f)
)

内容的提问来源于stack exchange,提问作者aj3423

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:10:10