【发布时间】:2015-07-28 06:10:48
【问题描述】:
在我的应用程序中,我有一个对话框,其中包含几个 SpannableString 对象。因为这是对话框,所以当用户离开应用程序并稍后返回时,我需要能够存储它。
但问题是如何将SpannableString 写入 Parcel?
【问题讨论】:
标签: android string parcelable spannablestring
在我的应用程序中,我有一个对话框,其中包含几个 SpannableString 对象。因为这是对话框,所以当用户离开应用程序并稍后返回时,我需要能够存储它。
但问题是如何将SpannableString 写入 Parcel?
【问题讨论】:
标签: android string parcelable 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;
......
【讨论】:
如果您使用 Parcelize,您可以将已处理的 Spannable 作为 CharSequence 保存到 Parcelized 数据类中。如果您以后使用它,它将起作用。
【讨论】:
扩展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?
}
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 注释。
【讨论】:
SpannableString 不可分割,因此您将无法保存它们并使用包裹重新创建它们。您可以做的是分别保存文本和跨度。文本和跨度是可解析的,因此当您重新创建它们时它们会很好。
【讨论】: