Kotlin - Создайте пользовательскую функцию ext для SpannableStringBuilder без повторяющихся аргументов при объявлении начала, конца и флешки для setSpans () - PullRequest
0 голосов
/ 10 декабря 2018

это MainActivity.kt до

var spannable = SpannableStringBuilder("$noColorText$coloredText")
spannable.setSpan(
    ForegroundColorSpan(ContextCompat.getColor(textView.context, R.color.mainGreen)),
    noColorText.length, spannable.length,
    Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
spannable.setSpan(
    StyleSpan(BOLD),
    noColorText.length, spannable.length,
    Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
textView.text = spannable

Вот мой подход.

Extension.kt

// TODO: e.g: "string".putSpans(start, end, flags) { ForgroundColorSpan(color), StyleSpan(BOLD) }
fun String.putSpans(vararg flags: Int.() -> Unit, spanBuilder: SpannableStringBuilder.() -> Unit):
    SpannableStringBuilder = SpannableStringBuilder(this).apply(spanBuilder)

MainActivity.kt

// TODO: Change SpannableBuilder to be modular (without, reinput duplicate args)
val resultSpan = "$noColorText$coloredText ".putSpans {
    setSpan(ForegroundColorSpan(ContextCompat.getColor(textView.context, R.color.mainGreen)),
        noColorText.length, this.length, // this is duplicate
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE) // this is duplicate
    setSpan(StyleSpan(BOLD),
        noColorText.length, this.length, // this is duplicate
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE) // this is duplicate
    }

textView.text = resultSpan

Возможно ли создать такое расширение, как это

"string".putSpans(start, end, flags) { ForgroundColorSpan(color), StyleSpan(BOLD) }

, поэтому нам не нужно использовать повторяющиеся аргументы начало, конец, а также флаги, но открытое для модификации, например:

"string".putSpans(start, end, flags) { // for default value
 span(ForgroundColorSpan(color), diffStart, diffEnd), 
 span(StyleSpan(BOLD), diffFlags) 
}

1 Ответ

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

Вы можете использовать расширения, включенные в core-ktx, которые упрощают использование, более конкретно, сборки SpannedString в kotlin следующим образом:

buildSpannedString {
    bold {
        append("hitherejoe")
    }
}

Полагаю, вы бы использовали это так:

buildSpannedString {
    bold {
        inSpans(ForegroundColorSpan(ContextCompat.getColor(textView.context, R.color.mainGreen))) {
            append("string")
        }
    }
}

См. androidx.text пакет для справки.

Я взял пример из этого среднего поста Джо Бирча.

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