Comment fusionner des objets spannable?
-
25-09-2019 - |
Question
Je divise un objet spannable en 3 parties, effectuer des opérations différentes, et je dois les fusionner.
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);
Comment puis-je faire? Je ne l'ai pas trouvé la méthode requise ou le constructeur pour le faire.
La solution
Vous pouvez utiliser ceci:
TextUtils.concat(span1, span2);
Autres conseils
Merci, cela fonctionne. Je l'ai remarqué que je peux fusionner même 3 objet spannable:
(Spanned) TextUtils.concat(foo, bar, baz)
Je sais que c'est vieux. Mais après avoir modifié Kotlin stdlib un peu j'ai ce code:
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) }
}
Espérons que cela pourrait aider quelqu'un.
Comme marwinXXII dit dans un commentaire, en utilisant TextUtils.concat
fonctionne, mais peut entraîner une perte de styles dans certains cas, lorsque vous avez plusieurs instances de la même période en une seule CharSequence
.
Une solution pourrait consister à écrire le CharSequence
à un Parcel
puis relit. Exemple Kotlin code d'extension pour ce faire ci-dessous:
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
}
Exemple d'utilisation de ce code:
TextUtils.concat(*yourListOfText.map { it.cloneWithSpans() }.toTypedArray())
Maintenant, vous pouvez concaténer tonnes de CharSequences
sans se soucier de perdre des styles et le formatage que vous avez sur eux!
Notez que cela fonctionne pour plus styles, il ne fonctionne pas tout le temps, mais devrait être suffisant pour couvrir tous les styles de base.