program tip

확장 가능한 개체를 병합하는 방법은 무엇입니까?

radiobox 2020. 12. 14. 08:01
반응형

확장 가능한 개체를 병합하는 방법은 무엇입니까?


스패닝 가능한 객체를 세 부분으로 나누고 다른 작업을 수행 한 다음 병합해야합니다.

Spannable str = editText.getText();
Spannable selectionSpannable = new SpannableStringBuilder(str, selectionStart, selectionEnd);
Spannable endOfModifiedSpannable = new SpannableStringBuilder(str, selectionEnd, editText.getText().length());
Spannable beginningOfModifiedSpannable = new SpannableStringBuilder(str, 0, selectionStart);            

내가 어떻게 해? 필요한 메서드 나 생성자를 찾지 못했습니다.


이것을 사용할 수 있습니다.

TextUtils.concat(span1, span2);

http://developer.android.com/reference/android/text/TextUtils.html#concat (java.lang.CharSequence ...)


감사합니다. 3 개의 스패닝 가능한 객체도 병합 할 수 있습니다.

(Spanned) TextUtils.concat(foo, bar, baz)

나는 이것이 오래된 것을 압니다. 하지만 kotlin stdlib를 약간 수정 한 후이 코드를 얻었습니다.

fun <T> Iterable<T>.joinToSpannedString(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "", limit: Int = -1, truncated: CharSequence = "...", transform: ((T) -> CharSequence)? = null): SpannedString {
    return joinTo(SpannableStringBuilder(), separator, prefix, postfix, limit, truncated, transform)
            .let { SpannedString(it) }
}

누군가를 도울 수 있기를 바랍니다.


marwinXXII가 주석에서 말했듯이 사용 TextUtils.concat은 작동하지만 단일 .NET 에 동일한 범위의 여러 인스턴스가있는 경우 일부 경우 스타일이 손실 될 수 있습니다 CharSequence.

해결 방법은을 쓸 수 CharSequenceA를 Parcel다음 그것을 다시 읽어. 이 작업을 수행하는 Kotlin 확장 코드의 예는 다음과 같습니다.

fun CharSequence.cloneWithSpans(): CharSequence {
    val parcel = Parcel.obtain()
    TextUtils.writeToParcel(this, parcel, 0)
    parcel.setDataPosition(0)
    val out = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel)
    parcel.recycle()
    return out
}

이 코드의 사용 예 :

TextUtils.concat(*yourListOfText.map { it.cloneWithSpans() }.toTypedArray())

이제 CharSequences스타일과 서식을 잃어 버릴 염려없이 수많은 데이터를 연결할 수 있습니다!

이것은 대부분의 스타일에서 작동하지만 항상 작동하지는 않지만 모든 기본 스타일을 포함하기에 충분해야합니다.

참고 URL : https://stackoverflow.com/questions/4605588/how-to-merge-some-spannable-objects

반응형