设置一个可扩展的字符串不适用于简单的 Textview

Posted

技术标签:

【中文标题】设置一个可扩展的字符串不适用于简单的 Textview【英文标题】:Setting a spannable string not working on a simple 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_
        android:layout_
        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"/>

【问题讨论】:

【参考方案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 版本,则将其关闭并在任何地方手动处理大写字母可能会更容易,而不必考虑资源和代码中的两种不同设置。

【讨论】:

以上是关于设置一个可扩展的字符串不适用于简单的 Textview的主要内容,如果未能解决你的问题,请参考以下文章

分页不适用于 11ty(十一)中的可扩展布局

用户定义的语言不适用于 Notepad++ 中的指定文件类型

SHA512 在 vba 中不适用于扩展字符集

jquery UI 可拖动不适用于 AJAX

ControlTextDidChange 不适用于设置 NSTextField 的字符串

如何将可绘制背景设置为仅将数字字符串转换为 android 中的另一个字符串?