Android 将值传递给包含链接的string.xml值

Android 将值传递给包含链接的string.xml值,android,string.xml,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> 当我删除传递的值时,一切都正常&当用户单击公司名称时,它会将他/她带到公司网站 请注意,我在没有传递值的情况下尝试了xml中的自动链

我在string.xml文件中有此值:

<string name="rights">Copyright © All Rights Reserved %1$d <b> <a href="http://www.example.com/">company name</a></b></string>
当我删除传递的值时,一切都正常&当用户单击公司名称时,它会将他/她带到公司网站

请注意,我在没有传递值的情况下尝试了xml中的自动链接,但它没有按预期工作

但是,当我添加传递的值时&使用公司名称上方的代码没有下划线&当用户单击它时,它将不起任何作用

如何编辑我的上述代码以通过本年度并保持链接行为正常


注意:我使用了
String.format
将当前年份显示为英文数字,而不考虑其他地区的数字。

我认为
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);

如果您只想使某些部分可单击,则在
setSpan()

中切换
0
span.length()
的值,我认为
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);

如果只想使某些部分可单击,则在
setSpan()

中切换
0
span.length()
的值。当字符串资源同时具有格式参数(如
%1$d
)和html标记时,必须使用多步骤过程来创建样式化的
字符序列。这项额外工作是必要的,因为
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>
最后,使用
Html.fromHtml()
解析Html标记:

CharSequence styled = Html.fromHtml(withHtmlMarkup);
然后,您可以将此
样式化的
文本设置为您的文本视图正常:

appInfoRights.setText(styled);
appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());
开发者指南:

通常,这不起作用,因为
格式(String,Object…
getString(int,Object…
方法会从字符串中删除所有样式信息。解决这一问题的方法是使用转义实体编写HTML标记,然后在格式化完成后,使用
fromHtml(String)
恢复转义实体


当您有一个同时具有格式参数(如
%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>
最后,使用
Html.fromHtml()
解析Html标记:

CharSequence styled = Html.fromHtml(withHtmlMarkup);
然后,您可以将此
样式化的
文本设置为您的文本视图正常:

appInfoRights.setText(styled);
appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());
开发者指南:

通常,这不起作用,因为
格式(String,Object…
getString(int,Object…
方法会从字符串中删除所有样式信息。解决这一问题的方法是使用转义实体编写HTML标记,然后在格式化完成后,使用
fromHtml(String)
恢复转义实体