Android API Guides---String Resources

字符串资源
字符串资源提供的文本字符串与可选的文本样式和格式应用程序。有三种类型,可以提供您的应用程序使用字符串资源:
字符串
XML资源,提供一个字符串。
字符串数组
XML资源,提供一个字符串数组。
数量字符串(复数)
携带对复数不同的字符串XML资源。
所有字符串都可以应用一些样式标记和格式化参数的。有关样式和格式字符串的信息,请参阅有关格式和样式的部分。
字符串
可以从应用程序或其他资源文件(如XML布局)引用一个字符串。
注意:一个串是利用在名称属性(未XML文件的名称)提供的值引用的一个简单的资源。所以,你可以字符串资源与其他资源的简单一个XML文件中结合起来,在一个<resources>元素。
文件位置:
RES /价值/ filename.xml中
文件名是任意的。在<字符串>元素的名称将被用作资源ID。
编译的资源数据类型:
资源指向字符串的指针。
资源引用:
在Java:R.string.string_name
在XML:@字符串/ string_name

句法:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string
        name="string_name"
        >text_string</string>
</resources>
ELEMENTS:
<resources>
需要。这必须是根节点。
无属性。


<string>
一个字符串,它可以包括造型标签。当心,你必须逃脱撇号和引号。有关如何正确风格和格式化你的字符串更多信息,请参阅设置和造型,下文。
属性:


名称
串。一种字符串名称。这个名称将被用作资源ID。
例:
在保存RES/价值/ strings.xml中的XML文件:

<?xml version="1.0" encoding="utf-8"?> <resources>     <string name="hello">Hello!</string> </resources>
这种布局XML应用一个字符串视图:

<TextView     android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:text="@string/hello" />
此应用程序代码检索字符串:

String string = getString(R.string.hello);
您可以使用的getString(INT)和gettext(INT)来检索字符串。的getText(INT)将保留应用到任何字符串丰富的文本样式。
字符串数组
字符串数组,可以从应用程序引用。
注意:一个字符串数组,是使用在名称属性(未XML文件的名称)提供的值引用的一个简单的资源。因此,您可以在一个XML文件中与其他简单的资源整合字符串数组资源,在一个<resources>元素。
文件位置:
RES/价值/ filename.xml中
文件名是任意的。在<串阵列>元素的名称将被用作资源ID。
编译的资源数据类型:
资源指向字符串数组。
资源引用:
在Java:R.array.string数组名
句法:

<?xml version="1.0" encoding="utf-8"?> <resources>     <string-array         name="string_array_name">         <item             >text_string</item>     </string-array> </resources>
ELEMENTS:
<resources>
需要。这必须是根节点。
无属性。


<string-array>
定义字符串数组。包含一个或多个<item>元素。
属性:


name
串。一种数组名。这个名称将被作为资源ID,以引用的阵列。
<item>
一个字符串,它可以包括造型标签。该值可以是到另一个字符串资源的参考。必须是一个<字符串数组>元素的子元素。当心,你必须逃脱撇号和引号。请参见格式化和造型,下面,关于正确的风格和格式化字符串的信息。
无属性。


例:
在保存RES/价值/ strings.xml中的XML文件:

<?xml version="1.0" encoding="utf-8"?> <resources>     <string-array name="planets_array">         <item>Mercury</item>         <item>Venus</item>         <item>Earth</item>         <item>Mars</item>     </string-array> </resources>
此应用程序代码检索一个字符串数组:

Resources res = getResources(); String[] planets = res.getStringArray(R.array.planets_array);
数量字符串(复数)
不同的语言有与数量语法的协议不同的规则。在英语中,例如,所述的数量1是一种特殊情况。我们写“1书”,但对于任何其他数据,我们会写“N书”。单数和复数之间的区别是很常见的,但其他语言做出更细的区分。由Android支持的全套是零,一,二,少很多,等。
决定哪一种情况下,使用一个给定的语言和数量的规则可能非常复杂,因此Android为您提供了方法,如getQuantityString()来选择合适的资源给你。
尽管历史上所谓的“量字符串”(现在仍然叫,在API),数量字符串应该只用于复数。这是使用量的字符串来实现类似Gmail的“收件箱”或“收件箱(12)”的错误,当有未读邮件,例如。这似乎方便,如果语句中使用量的字符串,而不是一个,但要注意的是,有些语言(如中国)根本不使这些语法区别是很重要的,所以您总能获得另一个字符串。
该字符串使用作出选择完全基于语法的必要性。在英语中,零字符串将即使数量为0被忽略,因为0是不是从语法2不同,或除1(“零的书”,“一书”,“两地书”的任何其他号码,等等)。相反,韩国只有另一个字符串将被使用。
不要被误导或者通过事实,也就是说,两种声音像它可能只适用于量2:语言可能需要2,12,102(等)都像对待彼此,但不同于其他数量。依靠您的翻译知道什么区别他们的语言实际上在坚持。
它通常尽量避免使用量中性配方量的字符串,如“书:1”。这会让你的生活和译者的生活更轻松,如果它是一个风格,是与您的应用程序保持一致。
注意:复数集合是使用在名称属性(未XML文件的名称)提供的值引用的一个简单的资源。因此,您可以在一个XML文件中与其他简单的资源整合复数资源,在一个<resources>元素。
文件位置:
RES /价值/ filename.xml中
文件名是任意的。在<复数>元素的名称将被用作资源ID。
资源引用:
在Java:R.plurals.plural_name
句法:

<?xml version="1.0" encoding="utf-8"?> <resources>     <plurals         name="plural_name">         <item             quantity=["zero" | "one" | "two" | "few" | "many" | "other"]             >text_string</item>     </plurals> </resources>
ELEMENTS:
<resources>
需要。这必须是根节点。
无属性。


<plurals>
串的集合,其中,根据某些事物的量被提供的一个字符串。包含一个或多个<item>元素。
属性:


name
串。一种用于对字符串的名称。这个名称将被用作资源ID。
<item>
一个复数或单串。该值可以是到另一个字符串资源的参考。必须是一个<复数>元素的子元素。当心,你必须逃脱撇号和引号。请参见格式化和造型,下面,关于正确的风格和格式化字符串的信息。
属性:


quantity
关键词。说明何时应该使用这个字符串的值。有效值,括号非穷尽的例子:
值说明
zero当语言需要的号码0的特殊处理(如阿拉伯语)。
one,其中一个语言需要类似的一个数特别处理(如用英语和大多数其他语言的数量1;俄罗斯,任何数量在1结束,但11不是结束是在这个类)。
two当语言需要像两个数字的特别处理(与2威尔士,或102斯洛文尼亚)。
few当语言需要“小”的数字特殊处理(如用2,3,和在捷克4;或结束2,3,或4而不是12,13,或14中的波兰的数字)。
many当语言需要“大”的数字特别处理(如用数字马耳他结束11-99)。
other当语言不要求一定量的特别处理(如在中国的所有号码,或英文42)。
例:
在保存RES /价值/ strings.xml中的XML文件:

<?xml version="1.0" encoding="utf-8"?> <resources>     <plurals name="numberOfSongsAvailable">         <!--              As a developer, you should always supply "one" and "other"              strings. Your translators will know which strings are actually              needed for their language. Always include %d in "one" because              translators will need to use %d for languages where "one"              doesn't mean 1 (as explained above).           -->         <item quantity="one">%d song found.</item>         <item quantity="other">%d songs found.</item>     </plurals> </resources>
XML file saved at res/values-pl/strings.xml:

?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals name="numberOfSongsAvailable">
        <item quantity="one">Znaleziono %d piosenkę.</item>
        <item quantity="few">Znaleziono %d piosenki.</item>
        <item quantity="other">Znaleziono %d piosenek.</item>
    </plurals>
</resources>
Java code:

int count = getNumberOfsongsAvailable();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count);
当使用getQuantityString()方法中,你需要通过计数两次,如果你的字符串包含字符串以数字格式。例如,对于发现字符串%d首歌曲,所述第一计数参数选择适当的复数串和所述第二计数参数被插入%d个占位符。如果您的多个琴弦不包括字符串格式化,你并不需要第三个参数传递给getQuantityString。
格式和样式
面是你应该知道一些重要的事情如何正确的格式和样式的字符串资源。
转义单引号和报价
如果你有一个单引号(')(在你的字符串,则必须以反斜线\)转义'或双引号括起来的字符串(“”)。例如,这里有一些字符串和不工作:

<string name="good_example">This\'ll work</string>
<string name="good_example_2">"This'll also work"</string>
<string name="bad_example">This doesn't work</string>
    <!-- Causes a compile error -->
如果你在你的强大的双引号,你必须转义(\“)。周围使用单引号括起来的不起作用。

<string name="good_example">This is a \"good string\".</string>
<string name="bad_example">This is a "bad string".</string>
    <!-- Quotes are stripped; displays as: This is a bad string. -->
<string name="bad_example_2">'This is another "bad string".'</string>
    <!-- Causes a compile error -->
格式化字符串


如果您需要格式化使用的String.format(字符串,对象...)你的字符串,那么你可以把你的格式参数的字符串资源这样做。例如,用下面的资源:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
在这个例子中,格式字符串有两个参数:%1 $ s是一个字符串%2 $ d是一个十进制数。您可以格式化从您的应用程序像这样的参数字符串:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
与HTML标记的样式

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="welcome">Welcome to <b>Android</b>!</string>
</resources>

Supported HTML elements include:

  • <b> for bold text.
  • <i> for italic text.
  • <u> for underline text.
  • 有时你可能想创建一个也用作格式字符串样式文本资源。通常情况下,这将无法工作,因为的String.format(字符串,对象...)方法将去除从字符串的所有样式信息。该工作周围,这是与实体逃脱,然后与fromHtml(字符串)恢复写HTML标签,格式发生之后。 例如:
    存储您的样式文本资源作为一个HTML转义字符串:
  • <resources>
      <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
    </resources>
    在这个格式化字符串,A <B>元素添加。请注意,打开支架HTML转义,使用的&lt; 符号。
    然后格式化字符串像往常一样,还叫fromHtml(字符串)的HTML文本转换为样式文本
  • Resources res = getResources();
    String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
    CharSequence styledText = Html.fromHtml(text);
    因为fromHtml(String)方法将格式化所有HTML实体,一定要逃避你格式化文本使用的字符串的任何可能的HTML字符,使用的HTMLEncode(字符串)。举例来说,如果你将传递一个字符串参数的String.format()可能包含字符,如“<”或“&”,那么他们必须在格式化之前,这样,当格式化字符串通过fromHtml传递逃脱, (字符串),人物出来最初编写的方式。 例如:
  • String escapedUsername = TextUtil.htmlEncode(username);
    
    Resources res = getResources();
    String text = String.format(res.getString(R.string.welcome_messages), escapedUsername, mailCount);
    CharSequence styledText = Html.fromHtml(text);

    与Spannables造型


    一个Spannable是一个文本对象,您可以用字体属性,如颜色和字体粗细的风格。您可以使用SpannableStringBuilder建立你的文本,然后应用在android.text.style包到文本中定义的样式。


    您可以使用下面的辅助方法,建立多创造spannable文本的工作:
  • /**
     * Returns a CharSequence that concatenates the specified array of CharSequence
     * objects and then applies a list of zero or more tags to the entire range.
     *
     * @param content an array of character sequences to apply a style to
     * @param tags the styled span objects to apply to the content
     *        such as android.text.style.StyleSpan
     *
     */
    private static CharSequence apply(CharSequence[] content, Object... tags) {
        SpannableStringBuilder text = new SpannableStringBuilder();
        openTags(text, tags);
        for (CharSequence item : content) {
            text.append(item);
        }
        closeTags(text, tags);
        return text;
    }
    
    /**
     * Iterates over an array of tags and applies them to the beginning of the specified
     * Spannable object so that future text appended to the text will have the styling
     * applied to it. Do not call this method directly.
     */
    private static void openTags(Spannable text, Object[] tags) {
        for (Object tag : tags) {
            text.setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK);
        }
    }
    
    /**
     * "Closes" the specified tags on a Spannable by updating the spans to be
     * endpoint-exclusive so that future text appended to the end will not take
     * on the same styling. Do not call this method directly.
     */
    private static void closeTags(Spannable text, Object[] tags) {
        int len = text.length();
        for (Object tag : tags) {
            if (len > 0) {
                text.setSpan(tag, 0, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            } else {
                text.removeSpan(tag);
            }
        }
    }
    下面的粗体,斜体和颜色的方法告诉你如何调用helper方法适用于android.text.style包中定义的样式。您可以创建类似的方法做其他类型的文本造型
  • /**
     * Returns a CharSequence that applies boldface to the concatenation
     * of the specified CharSequence objects.
     */
    public static CharSequence bold(CharSequence... content) {
        return apply(content, new StyleSpan(Typeface.BOLD));
    }
    
    /**
     * Returns a CharSequence that applies italics to the concatenation
     * of the specified CharSequence objects.
     */
    public static CharSequence italic(CharSequence... content) {
        return apply(content, new StyleSpan(Typeface.ITALIC));
    }
    
    /**
     * Returns a CharSequence that applies a foreground color to the
     * concatenation of the specified CharSequence objects.
     */
    public static CharSequence color(int color, CharSequence... content) {
        return apply(content, new ForegroundColorSpan(color));
    }
    这里有一个如何来链接这些方法来创建应用到各个单词的不同类型的造型的字符序列的例子
  • // Create an italic "hello, " a red "world",
    // and bold the entire sequence.
    CharSequence text = bold(italic(res.getString(R.string.hello)),
        color(Color.RED, res.getString(R.string.world)));






你可能感兴趣的:(java,android,api,sdk,阅读)