Как обнаружить разрывы строк в TextView - PullRequest
0 голосов
/ 21 декабря 2018

В своем приложении для Android я создал 8 TextViews, расположенных друг над другом.Теперь я хочу загрузить какой-нибудь простой текст в эти TextView-Lines.На данный момент мои строки имеют ";"в качестве разделителя для обозначения разрыва строки, однако было бы гораздо удобнее, если бы я обнаружил разрыв строки автоматически вместо использования жестко закодированной точки с запятой.

В данный момент это моя строка:

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.отдельные "текстовые строки" из-за техники анимации, которую я хочу использовать.Спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Хорошо, теперь у меня все работает:

Сначала вы должны добавить эти свойства для текстовых обзоров:

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

Если кто-нибудь знает более элегантный способ решить эту проблему, пожалуйста, примите ваши отзывы:)

0 голосов
/ 22 декабря 2018

Разрыв строки становится довольно сложным, поэтому я рекомендую, чтобы вы позволили 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, так что вы можете полностью отключить переносы в вашем случае.

0 голосов
/ 21 декабря 2018

Вы можете заполнить текстовое представление 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>");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...