0

我在 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 中尝试了 autoLink。

但是,当我添加传递的值并使用公司名称上方的代码没有下划线时,当用户单击它时,它什么也不做。

如何编辑我的上述代码以通过当前年份并保持链接行为正常?

注意:尽管有其他语言环境数字,我一直String.format将当前年份显示为英文数字。

4

2 回答 2

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

如果您只想使某些部分可点击,请切换 和0span.length()setSpan()

于 2019-01-03T13:24:07.690 回答
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 &lt;b> &lt;a href="http://www.example.com/">company name&lt;/a>&lt;/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...)andgetString(int, Object...)方法会从字符串中删除所有样式信息。解决此问题的方法是编写带有转义实体的 HTML 标记,然后fromHtml(String)在格式化发生后用 恢复。

于 2019-01-03T16:33:20.367 回答