【问题标题】:".(" in Jetpack Compose Text causes newlineJetpack Compose Text 中的“.(”会导致换行
【发布时间】:2021-08-09 04:15:47
【问题描述】:

在此 Jetpack Compose 代码中,第一个 Text 可组合的结果在新行中包含带括号的文本:

Column {
    Text(text = "2.(0123456789)",
            modifier = Modifier
                    .width(60.dp)
                    .padding(start = 5.dp))
    Spacer(modifier = Modifier . padding(20.dp))
    Text(text = "2.0123456789",
            modifier = Modifier
                    .width(60.dp)
                    .padding(start = 5.dp))
}

如果我删除“.”或删除“(”,则不会发生这种情况。

【问题讨论】:

  • 不知道为什么会这样,但是您是否尝试过使用 \ 转义字符
  • 你的宽度是60.dp,这意味着常规的换行规则适用,与Android的其余部分相同。是什么让您认为它做错了什么?
  • 我试过逃跑。至于换行的规则,“.”怎么办?和“(”因素?
  • @ianhanniballake 抱歉,我是 Android 新手,刚开始使用 Compose。我没有在 JavaFx 中遇到这个问题。我会研究规则以及如何得到我想要的谢谢。

标签: android android-jetpack-compose


【解决方案1】:

问题是modifier = Modifier.width(60.dp) 将固定宽度应用于您的Text

在您的Column 中使用Modifier.width(IntrinsicSize.Max)

Column(Modifier.width(IntrinsicSize.Max)) {
    Text(text = "2.(0123456789)",
        modifier = Modifier
            .padding(start = 5.dp))
    Spacer(modifier = Modifier . padding(20.dp))
    Text(text = "2.0123456789",
        modifier = Modifier
            .padding(start = 5.dp))
}

如果你想指定一个有限的宽度,你可以使用Modifier.requiredWidthInText中指定mindp和maxdp和maxLines = 1之间的宽度。

类似:

Column(Modifier.requiredWidthIn(0.dp , 75.dp)) {
    Text(
        text = "2.(0123456789)",
        modifier = Modifier
            .padding(start = 5.dp),
        maxLines = 1,
        overflow = TextOverflow.Ellipsis

    )
    Spacer(modifier = Modifier.padding(20.dp))
    Text(
        text = "2.0123456789",
        modifier = Modifier
            .padding(start = 5.dp),
        maxLines = 1,
        overflow = TextOverflow.Ellipsis
    )
}

否则,您将Modifier.requiredWidthIn(0.dp , 75.dp) 应用于文本组件而不是列。

Column(Modifier.width(IntrinsicSize.Max)) {
    Text(
        modifier = Modifier
            .requiredWidthIn(0.dp, 75.dp)
        maxLines = 1
    )
    //...
    Text(
        modifier = Modifier
            .requiredWidthIn(0.dp, 75.dp)
        maxLines = 1,
    )
}

【讨论】:

  • 谢谢,但我想让文本保持有限的宽度。在任何情况下,即使使用 IntrinsicSize,一旦达到最大宽度(对于括号之间的较长字符串),它仍然会在“.”之后中断。我有一个针对所需行为的功能请求,但在此之前,您似乎可以通过在适当的点插入“零宽度不间断空格”(\uFEFF)来使其工作。
  • @RickRegan 如果要指定宽度,只需在文本中添加 maxLines = 1。我已经更新了答案。
  • 但是这会截断“。”之后的行。我正在寻找一个固定宽度的多行文本,它只在宽度处中断,而不是根据任何其他规则。我认为在这一点上获得我想要的唯一方法是使用不间断空格。
【解决方案2】:

问题不在于字符转义。事实上,您已经应用了一个固定的小宽度,并且由于修饰符的顺序很重要,因此宽度会进一步修剪 5dps 的填充

编辑:我不太确定,但我认为这可能是因为 Text 固有地支持这样一个特性,即如果可以,文本保持器会在一行中显示一个单词。当您插入一个特殊字符(如句点或括号)时,它会将字符串的其余部分视为一个新句子(语法上),并观察它的长度,计算它不适合同一行,然后开始一个新行。然后长度仍然更大,但别无选择,只能开始新的一行。因此,其余的短语一直走到最后,然后在达到最大容量时开始新的一行。尝试在句点或括号后仅插入一个字符。我不认为它会插入一个新行,因为会有空间插入整个语句(在这种情况下,只有一个字符)。当我开始打字的时候,我认为这不是肯定的,但现在,我几乎确信确实如此。

【讨论】:

  • 我想要一个固定的宽度,根据其他答案的讨论。看起来这只是 Android 目前不直接支持的东西。
猜你喜欢
  • 2020-04-07
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
相关资源
最近更新 更多