【问题标题】:Setting a spannable string not working on a simple Textview设置一个可扩展的字符串不适用于简单的 Textview
【发布时间】:2017-04-20 14:19:40
【问题描述】:

我这辈子都无法理解为什么这个设置可扩展字符串的简单代码在这个 textview 上不起作用。如果日期是当天,下面的方法会在显示日期的文本之前添加一个“今天”标记,该标记应该是绿色的。

private void setTimeTextView(String timeString) {

    Calendar c = Calendar.getInstance();

    String todaysDateString = ApiContentFormattingUtil.getFullDateFormat(c.getTime());
    if (timeString.equals(todaysDateString)){
        String todayText = getResources().getString(R.string.today_marker);

        Spannable timeSpannable = new SpannableString(todayText + timeString);
        timeSpannable.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.greenish_teal)), 0,
                todayText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        mDateTime.setText(timeSpannable);
    } else {
        mDateTime.setText(timeString);
    }
}

但是,颜色不会改变。

这是该视图的 XML

<TextView
        android:id="@+id/newsfeed_date_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="23dp"
        android:textSize="12sp"
        android:textColor="@color/white_three"
        android:letterSpacing="0.06"
        app:fontPath="@string/opensans_bold_path"
        tools:text="Monday, January 1st"
        android:textAllCaps="true"
        tools:ignore="MissingPrefix"
        tools:targetApi="lollipop"/>

【问题讨论】:

    标签: android textview spannablestring


    【解决方案1】:

    在 Oreo 之前的版本中,android:textAllCaps="true" 属性设置将导致格式跨度从您的文本中删除。您需要删除该设置(或将其设置为false),并自己处理转换为大写,然后再从中创建SpannableString。例如:

    String todayText = getResources().getString(R.string.today_marker);
    String text = todayText + timeString;
    
    Spannable timeSpannable = new SpannableString(text.toUpperCase());
    

    这是由于 a known bug in the platform AllCapsTransformationMethod class,它在 Nougat 7.1 及更低版本上将文本处理为平面 String,基本上会删除您可能设置的任何格式范围。

    不幸的是,support/androidx 库也使用平台AllCapsTransformationMethod 类,因此它们的textAllCaps 属性也会发生这种情况;即,app:textAllCaps 在奥利奥之前也被破坏了。

    如前所述,这已在 Oreo 中得到纠正,因此在这些较新的版本中,此手动修复并不是绝对必要的。但是,如果您仍然支持 Pre-Oreo 版本,则将其关闭并在任何地方手动处理大写字母可能会更容易,而不必考虑资源和代码中的两种不同设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多