我在string.xml文件中有此值:
<string name="rights">Copyright © All Rights Reserved %1$d <b> <a href="http://www.example.com/">company name</a></b></string>
我已经将此代码传递给了上面的文本,并将该文本设置为TextView
private void setupAppInfoRights() {
int currentYear = Calendar.getInstance().get(Calendar.YEAR);
String rights = String.format(new Locale("en"), getString(R.string.rights), currentYear);
appInfoRights.setText(rights);
appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());
}
当我删除传递的值时,一切都会顺利进行;当用户单击公司名称时,它将带他/她进入公司网站。
请注意,当没有传递任何值但它无法按预期工作时,我尝试了xml中的自动链接。
但是,当我添加传递的值并使用公司名称上方的代码时,没有下划线;当用户单击该代码时,它不会执行任何操作。
如何编辑上面的代码以超过当前年份并保持链接行为正常?
注意:我使用String.format
将当前年份始终显示为英语数字,而不管其他区域设置数字如何。
答案 0 :(得分:1)
我认为您正在寻找SpannableStringBuilder
。
TextView linkTv = (TextView) findViewById(R.id.link_tv);
linkTv.setMovementMethod(LinkMovementMethod.getInstance());
Spannable span = (Spannable) linkTv.getText();
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget){
//open the link
}
};
span.setSpan(clickableSpan, 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//for bold
span.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
如果只想单击某些部分,请在0
中切换span.length()
和setSpan()
的值。
答案 1 :(得分:1)
如果同时具有格式参数(例如%1$d
)和html标记的字符串资源,则必须使用多步过程来创建样式为CharSequence
的字符串。这项额外的工作是必要的,因为Resources.getString(int, Object...)
和String.format(String, Object...)
只能返回String
实例,而不能返回其他能够保存样式信息的CharSequence
子类。
首先,将您的字符串资源更改为使用html实体来转义html标签:
<string name="rights">Copyright © All Rights Reserved %1$d <b> <a href="http://www.example.com/">company name</a></b></string>
接下来,获取String
,其格式参数替换为所需的实际值:
String withHtmlMarkup = getString(R.string.rights, currentYear);
最后,使用Html.fromHtml()
解析html标记:
CharSequence styled = Html.fromHtml(withHtmlMarkup);
然后,您可以像平常一样将此styled
文本设置为TextView:
appInfoRights.setText(styled);
appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());
开发者指南:https://developer.android.com/guide/topics/resources/string-resource#FormattingAndStyling
通常,这是行不通的,因为
format(String, Object...)
和getString(int, Object...)
方法会从字符串中剥离所有样式信息。解决方法是使用转义的实体编写HTML标签,然后在进行格式化后使用fromHtml(String)
恢复这些实体。