【发布时间】:2021-08-27 08:32:29
【问题描述】:
我有一个TextView,其中包含一个 60 个字符的随机字符串。
字符串是一个单词,不包含任何空格。
问题是在某些字符之后(例如@, &, %)我得到一个我不想要的自动换行符。
我想要的结果是每一行都被填满,并且没有随机的换行符。
我尝试设置breakStrategy 和更新hyphenationFrequency,但这没有帮助。
如何防止这种情况发生?
更新:感谢@Darkman,这是我编写的解决方案。它会检查有多少个字符可以在没有换行符的情况下放入一行,并在末尾附加 \n。
请注意,对于我的用例字符串没有空格,并且我使用的是等宽字体。
fun TextView.toNonBreakingString(text: String?): String {
if (text == null) return ""
val container = parent as? ViewGroup ?: return text
val lineWidth = (container.width - container.paddingStart - container.paddingEnd).toFloat()
val maxCharsInOneLine = paint.breakText(text, 0, text.length, true, lineWidth, null)
if (maxCharsInOneLine == 0) return text
val sb = StringBuilder()
var currentLine = 1
var end = 0
for (i in 0..text.count() step maxCharsInOneLine) {
end = currentLine * maxCharsInOneLine
if (end > text.length) end = text.length
sb.append(text.subSequence(i, end))
sb.append("\n")
currentLine = currentLine.inc()
}
if (end < text.length) {
val remainingChars = text.length - end
sb.append(text.takeLast(remainingChars))
}
return sb.toString()
}
【问题讨论】:
-
在
TextView上设置android:maxLines="1"。 -
如果它适合一行当然没有换行问题:) 正如您在屏幕截图中看到的那样,它并不总是适合一行,我希望我的字符串完全可见。
-
然后设置
android:maxLines="1",设置合适的布局规则来控制宽度,并使用autosize属性根据字符串的长度自动减小字体大小。 -
如果用户在 Android 设置中更改字体大小,Autoresize 会破坏可访问性。我真的不想使用它,也不想从 UI 角度来看它是单行的。我的问题不是如何避免换行,而是如何仅在行到达布局末尾时才换行。
-
“如果用户在 Android 设置中更改字体大小,自动调整大小会破坏可访问性”——我不知道如何。无论用户选择的字体比例如何,自动调整大小都会缩小文本以适应。如果您担心 60 个字符太小,请使用少于 60 个字符。 “从 UI 的角度来看,我不希望这是单行”——所以......您希望它不止一行,但不超过一行?这在数学上是如何工作的?
标签: android android-layout textview line-breaks