在我的应用程序中,我有一个包含少量SpannableString
个对象的对话框。因为这是对话框,所以我需要能够在用户离开应用程序时存储它并稍后再返回它。
但问题是如何将SpannableString
写入Parcel?
答案 0 :(得分: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 :(得分:1)
使用TextUtils.writeToParcel()
方法
支持TextUtils中的跨度
TextUtils
line 555-604
public static final int ALIGMENT_SPAN = 1;
......
答案 2 :(得分:0)
扩展Kandyzowana Papaja的答案,您可以使用Kotlin Extension functions并将SpannableString置于Parcelable内部,并像处理普通Strings一样进行操作。
扩展功能
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的automatic Parcelable generation的@Parcelize
注释。
答案 3 :(得分:0)
如果使用Parcelize,则可以将已处理的Spannable作为CharSequence保存到已打包的数据类中。如果您以后使用它,它将起作用。
答案 4 :(得分:-1)
SpannableString不是parceable,因此您将无法保存它们并使用parcel重新创建它们。你可以做的是分开保存文本和跨度。文本和跨度是可以分配的,因此当您重新创建它们时它们会很好。