Android 15 Tooltip 底部超出屏幕高度时被截断

问题描述 投票:0回答:1

下面的代码在 Android 14 上运行良好,但在 Android 15 上,工具提示的底部被截断:

truncated

红色边框的底部缺失,只有字母“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)
    )
}
android tooltip android-15
1个回答
0
投票

看起来您需要设置窗口插入,以在边缘到边缘模式下将 Activity 的内容保留在系统栏之外(Android 15 几乎需要这样做)。

请参阅针对 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。

© www.soinside.com 2019 - 2024. All rights reserved.