如何将SpannableString写入parcel?

问题描述 投票:5回答:4

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

但问题是如何将SpannableString写入包裹?

android string parcelable spannablestring
4个回答
9
投票

我实际上发现了一些使用已有功能的方法,虽然我不确定它是否适用于所有类型的跨度,或仅适用于我正在使用的那些。

在内部写包裹方法你必须添加

@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);
}

1
投票

使用TextUtils.writeToParcel()方法

支持TextUtils中的跨度

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


0
投票

Kandyzowana Papaja上扩展回答你可以使用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?
}

可以实现的

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的@Parcelizeautomatic Parcelable generation注释不起作用。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.