【问题标题】:Dynamically setting links to text in strings.xml在 strings.xml 中动态设置文本链接
【发布时间】:2010-02-11 11:54:25
【问题描述】:

我正在尝试制作一个内置本地化的应用程序,但我想要一种可以在文本中创建 Web 链接的方法,该 URL 在其他地方定义(为了便于维护)。

所以,我在 res/values/strings.xml 中有我的链接:

<?xml version="1.0" encoding="utf-8"?>
<resources>
...
    <string name="link1">http://some.link.com</string>
    <string name="link2">http://some.link2.com</string>
</resources>

以及我在 res/values-en-rGB/strings.xml 中的本地化文本

<?xml version="1.0" encoding="utf-8"?>
<resources>
...
    <string name="sampleText">Sample text\nMore text and link1\nMore text and link2.</string>
</resources>

我还没有测试过这个位,但是从localization section of developer.android.com 中可以看出,这种减少内容重复的方法应该可以工作,尽管我不确定我应该把意大利语放在哪个文件夹中。它会在“res/values-it-rIT/strings.xml”中吗?假设我也有各种其他语言。

我正在寻找一种方法来获取基本本地化的“sampleText”并插入我的 html 链接,并在点击时让它们工作。到目前为止,我已经尝试了两种方法:

1,

在 'sampleText' (%s) 中设置一些格式:

<string name="sampleText">Sample text\nMore text and <a href="%s">link1</a>\nMore text and <a href="%s">link2</a>.</string>

然后像这样处理文本:

TextView tv = (TextView) findViewById(R.id.textHolder);
tv.setText(getResources().getString(R.string.sampleText, getResources().getString(R.string.link1), getResources().getString(R.string.link2)));

但是当我点击链接时这不起作用,即使链接文本被放入正确的位置。

2,我尝试使用 Linkify,但正则表达式路线可能很困难,因为我正在考虑支持基于非拉丁语的语言。我尝试在链接文本周围放置一个自定义 xml 标记,然后执行以下操作:

Pattern wordMatcher = Pattern.compile("<span1>.*</span1>");
String viewURL =    "content://" + getResources().getString(R.string.someLink);
Linkify.addLinks(tv, wordMatcher , viewURL );

但这也没有用。

那么,我想知道是否有一种方法可以将多个 URL 动态添加到将链接到 Web 内容的同一文本的不同部分?

【问题讨论】:

  • 也许您可以将@dule 的答案标记为正确答案:)

标签: android text dynamic localization hyperlink


【解决方案1】:

问题是您的“a href”链接标签在strings.xml 内,并且在解析strings.xml 时被解析为标签,这是您不想要的。这意味着您需要让它忽略使用 XML 的 CDATA 的标签:

&lt;string name="sampleText"&gt;Sample text &lt;![CDATA[&lt;a href="http://www.google.com"&gt;link1&lt;/a&gt;]]&gt;&lt;/string&gt;

然后您可以继续使用Html.fromHtml() 并使用LinkMovementMethod 使其可点击:

TextView tv = (TextView) findViewById(R.id.textHolder);
tv.setText(Html.fromHtml(getString(R.string.sampleText)));
tv.setMovementMethod(LinkMovementMethod.getInstance());

【讨论】:

  • 不要忘记网址中的 http://,否则我会收到“No Activity found to handle intent”错误
  • 谢谢!最干净的答案!
  • 字符串资源未记录为支持任意 HTML 标记。 The only documented and supported ones&lt;b&gt;&lt;i&gt;&lt;u&gt;。我不建议依赖其他任何东西,例如 &lt;a&gt;,它适用于所有 Android 版本和设备。
【解决方案2】:

在您的布局中将android:autoLink 设置为web

<TextView android:text="@string/text_with_url"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web" />

然后在 strings.xml 中添加 URL。

<string name="text_with_url">http://stackoverflow.com/ FTW!</string>

【讨论】:

    【解决方案3】:

    尝试使用Html.fromHtml() 将HTML 转换为您放入TextViewSpannable。有了#1 中的内容,我希望 TextView 显示 HTML 源代码,而不是呈现的 HTML。

    【讨论】:

    • 使用#1 中的示例文本我试过这个:tv.setText(Html.fromHtml(getResources().getString(R.string.sampleText, getResources().getString(R.string) .someLink), getResources().getString(R.string.someLink2))), TextView.BufferType.SPANNABLE);但仍然没有得到可点击的链接。我是在布局中遗漏了什么还是遗漏了什么?
    • 这可能会起作用 CharSequence str=getResources().getText(R.string.sampleText);
    • 我无法让它工作。它只是显示超链接,不可点击。
    【解决方案4】:

    你必须执行

    setMovementMethod(LinkMovementMethod.getInstance());
    

    在您的文本视图上

    这是一个更好的例子:

    clickable-urls-in-android-textviews

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      相关资源
      最近更新 更多