在textAllCaps上设置textColorLink?

3

我有一个TextView,应该全部大写,并将其中发现的任何URL标记为特定颜色,因此我尝试使用textColorLink,并选择选项textAllCaps="true",但是URL没有着色,我的猜测是正则表达式不匹配大写字母的URL,因为如果相同的文本以小写形式出现,则URL会被着色。

我尝试用以下方法解决这个问题:

Spannable formatted = new SpannableString(text);
Pattern url = Pattern.compile(
            "(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
Matcher matcher = url.matcher(text.toLowerCase());

while (matcher.find())
{
    Log.e("TEST",matcher.group());
    int begIndex = matcher.start();
    int endIdx = begIndex + matcher.group().length() - 1;
    Log.e("Found", String.valueOf(begIndex));
    formatted.setSpan(new ForegroundColorSpan(
                    getResources().getColor(android.R.color.holo_red_light)),
                begIndex, endIdx, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
mTextView.setText(formatted);

显然它找到了文本,但是再次没有着色。我已经做了几个小时了,你该如何解决这个问题?


你的问题有点不清楚。你所说的“由于URL中的相同文本以小写形式呈现时会变色”,是指如果文本以小写形式出现,则URL会变色吗? - Rajen Raiyarela
是的,我有一个文本字符串,当它是小写时会被着色,但当它是大写时则是普通的。 - user_4685247
1个回答

2
当您尝试将字符串转换为大写时,会丢失颜色。但是,如果您添加另一个SpannableString并将其传递给string.toUpperCase,则可以设置Span...
SpannableString formatted = new SpannableString(urlString);
Pattern url = Pattern.compile("(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
Matcher matcher = url.matcher(urlString.toLowerCase());

//Here you save the string in upper case
SpannableString stringUpperCase = new SpannableString(formatted.toString().toUpperCase());

while (matcher.find()) {

   int begIndex = matcher.start();
   int endIdx = begIndex + matcher.group().length() - 1;
   stringUpperCase.setSpan(new ForegroundColorSpan(R.color.Red),
                        0, formatted.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
TextView text = (TextView) findViewById(R.id.textView);
text.setText(string);

应该可以工作...


从xml中删除textAllCaps="true"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接