【问题标题】:Android: getString() from resources loses any tags in the stringAndroid:来自资源的 getString() 会丢失字符串中的所有标签
【发布时间】:2012-03-27 14:52:33
【问题描述】:

例如:

我在资源中有一个字符串:

<string name="smth"><small>hey girls</small></string>

当我在 xml 资源文件中使用它时(例如在某些文本视图中),

android:text="@string/smth"

没有任何问题。它考虑了“小”标签。它使字符串更小。但是当我想这样使用它时:

String smth = getString(R.string.smth);

someTextView.setText(Html.fromHtml(smth));

字符串没有任何标签!!!

任何帮助表示赞赏。 丹

【问题讨论】:

    标签: android resources


    【解决方案1】:

    使用带有转义实体的 HTML 标记。

    你的问题直接回答in the official documentation

    有时您可能想要创建一个样式化的文本资源,该资源也是 用作格式字符串。通常,这不起作用,因为 String.format(String, Object...) 方法将剥离所有样式 来自字符串的信息。解决此问题的方法是编写 带有转义实体的 HTML 标记,然后用 fromHtml(String),在格式化之后。例如:

    将您的样式文本资源存储为 HTML 转义字符串:

    <resources>
      <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
    </resources>
    

    在这个格式化的字符串中,添加了一个&lt;b&gt; 元素。请注意,左括号是 HTML 转义的,使用 &amp;lt; 表示法。 然后像往常一样格式化字符串,还要调用fromHtml(String)将HTML文本转换为样式文本:

    Resources res = getResources();
    String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
    CharSequence styledText = Html.fromHtml(text);
    

    【讨论】:

    • 这似乎不再有效。当我将 更改为 <b> 时,我收到一个 XML 构建错误。
    • 看起来 XML 非常挑剔,您必须使用位置参数。如果您只使用 %s 并让 String.format() 按顺序分配它们,您将收到 XML 构建错误。
    • 你引用了错误的段落,因为上面说你需要 not 逃避任何东西:stackoverflow.com/a/18199543/89818
    • 这很好用。谢谢。我没有使用单独的 String.format(...),而是成功使用了 res.getString(R.string.welcome_messages, username, mailCount)。
    • 完美运行。如果您使用的是 androidx.core 库,建议您将 Html.fromHtml(text) 替换为 HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_COMPACT) 以确保与操作系统版本 兼容
    【解决方案2】:

    为什么不尝试用对应的unicode字符替换''和'\'呢?

    问候。

    【讨论】:

    • 为什么不把它放到 CDATA 部分?
    【解决方案3】:

    有时只有 unicode 字符或 &lt;![CDATA[ your HTML ]]&gt; 会有所帮助,但不会像 Rajkiran 建议的那样使用引号。另见How to make Resources.getStringArray work with HTML markup in Android

    【讨论】:

      【解决方案4】:

      如果您不希望通过 getString() 删除 html 标签。您必须在字符串中添加一个和 [![CDATA]] 标记,例如:

      <string name="get_string_with_Html_tags"><Data><![CDATA[ This is an example.
              <br><br>
              <font color=\'black\'>black text:
              </font>
              <br><br>
              <font color=\'red\'>red text</font>
              <br></br> ]]> </Data></string>
      

      【讨论】:

        【解决方案5】:

        只需将您的字符串放在双引号 " " 中。这样每次你不需要放对应的unicode字符,可以简单地使用刚刚用双引号括起来的原文。在文本周围加上引号意味着,里面的内容只是纯文本的一部分,并不旨在被解析。

        例如&lt;string name="smth"&gt;"&lt;small&gt;hey girls&lt;/small&gt;"&lt;/string&gt;

        出现这个问题的原因是,标签遵循 HTML 约定,所以每当你在 之间写一些东西时,它都会被视为标签。安卓试图解析它。你会得到错误,因为它在 strings.xml 中不可解析。

        【讨论】:

        • 对我不起作用。 getString() 去掉标签,即使字符串被引用了
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        • 1970-01-01
        • 2016-10-09
        相关资源
        最近更新 更多