将值传递给其中具有链接的string.xml值

时间:2019-01-03 13:04:30

标签: android string.xml

我在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将当前年份始终显示为英语数字,而不管其他区域设置数字如何。

2 个答案:

答案 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 &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...)getString(int, Object...)方法会从字符串中剥离所有样式信息。解决方法是使用转义的实体编写HTML标签,然后在进行格式化后使用fromHtml(String)恢复这些实体。