如何将SpannableString写入parcel?

How to write SpannableString to parcel?

在我的应用程序中,我有一个包含几个 SpannableString 对象的对话框。因为这是对话框,所以我需要能够在用户离开应用程序并稍后返回时存储它。

但问题是如何将SpannableString写入Parcel?

SpannableString 不可分割,因此您将无法保存它们并使用包裹重新创建它们。您可以做的是分别保存文本和跨度。文本和跨度是可分割的,因此当您重新创建它们时它们会很好。

我实际上找到了一些使用现有函数来完成此操作的方法,尽管我不确定它是否适用于所有类型的跨度,还是仅适用于我正在使用的跨度。

里面写包裹的方法你要加

@Override
public void writeToParcel(Parcel dest, int flags) {
    TextUtils.writeToParcel(mSpannableString, dest, flags);
}

然后为了从 Parcel 中提取 SpannableString,您应该使用这个

public CustomConstructor(Parcel parcel) {
    mSpannableString = (SpannableString) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
}

使用TextUtils.writeToParcel()方法

在 TextUtils 中支持 span

TextUtils line 555-604 public static final int ALIGMENT_SPAN = 1; ......

扩展 Kandyzowana Papaja answer you can use Kotlin Extension functions 并将 SpannableString 放入 Parcelable 中,并像处理普通字符串一样执行操作。

扩展函数

import android.os.Parcel
import android.text.SpannableString
import android.text.TextUtils

fun Parcel.writeSpannableString(spannableString: SpannableString?, flags: Int) {
    TextUtils.writeToParcel(spannableString, this, flags)
}

fun Parcel.readSpannableString() : SpannableString? {
    return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this) as SpannableString?
}

Parcelable 实现

import <your.path.to.extension.file>.readSpannableString
import <your.path.to.extension.file>.writeSpannableString

[...]

private constructor(parcel: Parcel) : super(parcel) {
    someString = parcel.readString()
    someInteger = parcel.readInt()
    someSpannableString = parcel.readSpannableString() // using extension function
}

override fun writeToParcel(out: Parcel, flags: Int) {
    super.writeToParcel(out, flags)
    out.writeString(someString)
    out.writeInt(someInteger)
    out.writeSpannableString(someSpannableString, flags) // using extension function
}

但是要小心。我很确定这不适用于 Kotlin 的 automatic Parcelable generation.

@Parcelize 注释

如果您使用 Parcelize,您可以将一个已经处理过的 Spannable 作为 CharSequence 保存到 parcelized 数据中 class。如果您以后使用它,它将起作用。