【问题标题】:How to write SpannableString to parcel?如何将 SpannableString 写入包裹?
【发布时间】:2015-07-28 06:10:48
【问题描述】:

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

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

【问题讨论】:

    标签: android string parcelable spannablestring


    【解决方案1】:

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

    你必须在里面写包裹方法

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

    【讨论】:

      【解决方案2】:

      使用TextUtils.writeToParcel()方法

      TextUtils 中支持 span

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

      【讨论】:

        【解决方案3】:

        如果您使用 Parcelize,您可以将已处理的 Spannable 作为 CharSequence 保存到 Parcelized 数据类中。如果您以后使用它,它将起作用。

        【讨论】:

          【解决方案4】:

          扩展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 注释。

          【讨论】:

            【解决方案5】:

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

            【讨论】:

            • 怎么在任何 utils 类中都没有函数来做这样的事情?抱歉这个反问句...
            • 我希望我能给你一个答案,但我真的没有。大声笑
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-05
            • 1970-01-01
            • 2014-07-30
            • 2011-12-31
            • 1970-01-01
            • 2013-01-07
            相关资源
            最近更新 更多