如何在TextView中检测换行符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在TextView中检测换行符相关的知识,希望对你有一定的参考价值。

在我的android应用程序中,我创建了8个堆叠在一起的TextView。现在我想将一些纯文本加载到那些TextView-Lines中。目前我的弦乐队有一个“;”作为分隔符来表示换行符,但是如果我自动检测换行符而不是使用硬编码的分号aproach会更方便。

这是我目前的字符串:

myString = "" +
"This seems to be some sort of spaceship,;" +
"the designs on the walls appear to be of;" +
"earth origin. It looks very clean here.;"

在我的另一个类中,我将此字符串加载到8个TextViews中,我使用“;”将其加载到ArrayList中。作为分隔符。

public fun fillLines(myString: String) {
    // How To Make Line Breaks Automatic??

    for(i: Int in str until myString.split(";").size) {
        if(i > textViewArray.size - 1) {
            break
        }
        textViewArray[i].text = myString.split(";")[i]
        textViewArray[i].alpha = 1.0f
    }
}

有没有什么办法可以得到与上面显示的相同的结果,但没有将分隔符硬编码为“;”但不知何故,会以某种方式自动检测TextView内部会发生的换行符,然后将其用作分隔符以前进所有8个TextView“行”。

我需要8个TextViews堆叠在一起作为单独的“文本行”的原因是因为我想使用的动画技术。谢谢你的帮助!

答案

您可以使用html填充文本视图。下面的例子。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
      tvDocument.setText(Html.fromHtml(bodyData,Html.FROM_HTML_MODE_LEGACY));
 } else {
      tvDocument.setText(Html.fromHtml(bodyData));
 }

如果你的分隔符;它可能是调用方法replaceAll(";", "<br>");

另一答案

好的,我现在就开始工作了:

首先,您必须为textviews添加以下属性:

android:singleLine="true"
android:ellipsize="none"

然后你可以这样做:

public fun fillStorylines() {
    val linecap = 46
    var finalLine: String
    var restChars = ""
    val index = 9999
    val text1: String = "" +
            "This seems to be some sort of spaceship, " +
            "the designs on the walls appear to be of " +
            "earth origin. It looks very clean here. "
    for(j: Int in 0..index) {
        try {
            finalLine = ""
            val lines: List<String> = (restChars + text1.chunked(linecap)[j]).split(" ")
            for (i: Int in 0 until lines.size - 1) {
                finalLine += lines[i] + " "
            }
            textViewArray[j].text = finalLine
            textViewArray[j].alpha = 1.0f
            restChars = lines[lines.size - 1]
        } catch (ex: Exception) {
            break
        }
    }
}

如果有人知道更优雅的方式来解决这个问题,请继续,感谢您的反馈意见:)

另一答案

换行变得相当复杂,所以我的建议是允许TextView执行测量和布局以确定换行符。您可以使用与其他视图相同的样式来设置不可见的TextView,并将其附加到布局中,使其与您的各个TextView实例具有相同的宽度。从那里,添加一个布局更改侦听器,然后您可以从TextView Layout中检索各个行:

myTextView.text = // your text string here
myTextView.addOnLayoutChangeListener { view, _, _, _, _, _, _, _, _ ->
    (view as? TextView)?.layout?.let { layout ->
        // Here you'll have the individual broken lines:
        val lines = (0 until layout.lineCount).map {
            layout.text.subSequence(layout.getLineStart(it), layout.getLineVisibleEnd(it)
        }
    }
}

也就是说,这有一个警告,你将失去TextView提供的连字符,所以你可能希望在你的情况下完全禁用连字符。

以上是关于如何在TextView中检测换行符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中的 TextView 中添加换行符?

如何在android库的片段中添加按钮和textView

android TextView:如何避免换行?

片段中的TextView在Android Studio中返回Null

Android \n 换行符在 textview 中转义

调整片段中 TextView 的文本大小