Android 入门之 -- 在字符串中加入样式

    技术2022-05-20  51

    参考:Android手册docs/guide/topics/resources/string-resource.html

     

    1. 在字符串中加入样式标签

     

    Android开发中,strings.xml用于存放程序使用的字符串资源,但是这些字符串在应用程序中显示时通常是没有格式的,这样就显得有些呆板;或者格式有些单一,比如使用android:textStyle来控制字符显示样式,但是这样在显示大量文本同时要加入不同样式时控制起来非常不方便。好在Android对string资源支持得很好,字符串定义时可以加入样式控制;利用这一点,可以在应用程序中得到类似网页中文本显示的效果。

     

    Android字符串支持HTML风格的字符串属性bold/italic/underlining,对应的标签为<b><i><u>。例如,在strings.xml中定义:        <string name="html_style"><b>Bold</b>,<i>Italic</i>,<u>Line</u></string>

     

    在TextView中使用android:text="@string/html_style"来访问这个字符串,显示效果为:

     

    如果是在代码中使用:

    private TextView textView; ... String html_style = getResources().getString(R.string.html_style); Log.i(APP_TAG, html_style); textView = (TextView) findViewById(R.id.text_demo); textView.setText(html_style);

    则HTML样式会被从字符串中略去,显示效果为:

     

    要保存HTML样式,加载字符串值时使用:

    CharSequence html_style = getResources().getText(R.string.html_style);

    则显示效果跟使用android:text="@string/html_style"是一样的。要注意的是,使用getString/getText得到的字符串在使用Log.i写日志时都会把HMTL样式略去

     

    2. 使用格式化字符串

     

    Android还支持格式化字符串。定义格式字符串:     <string name="format">UPPERCASE: %%S/nLOWERCASE: /%s</string> 注意,定义格式字符串时要对符号'%'进行转义。(这里是瞎试的,后面会有正确的格式字符串定义)

    String app_name = getResources().getString(R.string.app_name); String format = getResources().getString(R.string.format); String result = String.format(format, app_name, app_name); Log.i(APP_TAG, format); textView = (TextView) findViewById(R.id.text_demo); textView.setText(result);

    显示如下:

     

    很奇怪的结果。网上搜了一下,Android文档中给出了介绍 guide/topics/resources/string-resource.html ,定义格式控制时要使用"%[index]$[type]",index从1开始计数,即对第一个格式控制对应index为1。修改格式字符串:     <string name="format">UPPERCASE: %1$S/nLOWERCASE: %2$s</string> 显示如下:

     

    有关字符串格式串的信息,可以参考docs/reference/java/util/Formatter.html对java.util.Formatter的介绍。

     

    3. 在格式化字符串中加入样式控制

     

    如果要在格式串里加入样式控制,则需要对样式控制标签进行转义,否则String.format会略去这些样式标签:     <string name="format">UPPERCASE: <i> %1$S<i/> /nLOWERCASE: <u> %2$s<u/> </string> 显示如下:

    这里格式控制并没有起作用。需要使用HTML.fromHtml来激活标签字符串的功能:

    String app_name = getResources().getString(R.string.app_name); String format = getResources().getString(R.string.format); String result = String.format(format, app_name, app_name); CharSequence styledResult = Html.fromHtml(result); textView = (TextView) findViewById(R.id.text_demo); textView.setText(styledResult);

    显示如下:

    这次显示字体有了有了<i>和<u>样式。但是,注意到"LOWERCASE:"也是斜体了,而且'/n'没有起作用。

     

    搜了一下,由于字符串经过HTML式处理,所以'/n'换行不起作用,需要使用<br>:

              <string name="format">UPPERCASE: <i>%1$S<i/><br> LOWERCASE: <u>%2$s<u/></string>

    显示效果如下:

    这次显示有了<i>和<u>效果,同时也保持了换行。但是注意到<i>效果超出了预想的范围。看了一下,原来是写错了format:

             <string name="format">UPPERCASE: <i>%1$S</i> <br>LOWERCASE: <u>%2$s</u> </string>

     

    另外,要注意Html.fromHtml会格式化所有的HTML实体,所以要记得先将HTML字符转义后再交给Html.fromHtml处理,这要使用TextUtil.htmlEncode来处理转义:

    String escapedStr = TextUtil.htmlEncode(strSource); String text = String.format(formatStr, escapedStr); CharSequence styledText = Html.fromHtml(text);

     

     


    最新回复(0)