Android字符串资源及其格式化

在Android项目布局中,资源以XML文件的形式存储在res/目录下。为了更好的实现国际化及本地化,字符串集通常以XML文件的形式存储在res/values/目录下。

1、纯文本字符串

一般来说,使用纯文本字符串仅仅需要res/values目录下的一个XML文件(通常命名为res/values/strings.xml,可以使用其它的文件名替换strings),根元素为resources,希望编码为资源的每个字符串都有一个string子元素。String元素包含name特性,它标示了此字符串的唯一名称,还有一个文本元素,包含字符串的文本。

字符串的表示分以下三种情况:

a) 普通字符串(不含双引号(”)及单引号(’))。其在XML文件中如代码一所示定义。

代码一:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">HelloWorld!</string>
  4. </resources>

b)字符串仅含单引号。其在XML文件中如代码二或代码三(使用转义字符反斜杠“/”)所示定义。

代码二:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">"Hello'World!"</string>
  4. </resources>

代码三:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">Hello/'World!</string>
  4. </resources>

c)其它情况下的字符串。其在XML文件中如代码三所示定义,即使用一个前置反斜杠进行转义。代码四给出了一个示例。

代码四:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">Hello/'World/"!</string>
  4. </resources>

2、格式字符串

Android与Java的其它实现一样支持格式字符串。这里字符串包含一些占位符,表示在运行时要使用可变信息替换的数据(例如,Hello everyone, my name is %1$s)。占位符的规定简述如下:其使用%[index]$[type]格式进行标记,index标记替换资源中第index个资源对应的位置,type则标示所要替换的资源的类型(s表示资源为字符串格式)。这里给出一个格式字符串的例子,代码五为文件strings.xml中的内容,代码六为进行字符串替换时的Java代码,图1则给出了最终的效果图。

代码五:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">HelloWorld,mynameis%1$s!</string>
  4. <stringname="app_name">MyString</string>
  5. </resources>

代码六:

  1. TextViewmytext=(TextView)findViewById(R.id.mystring);
  2. Stringmyname=getString(R.string.hello);
  3. myname=String.format(myname,"clark");
  4. mytext.setText(myname);

图1:

3、样式字符串

Android中可以使用<b>、<i>及<u>的轻量级HTML标记对字符串进行样式处理。有如下几种方法进行字符串的样式化。

a) 直接将HTML标记写入字符串资源中,同时在布局文件中直接引用。这里给出一个例子,代码七为文件strings.xml中的内容,代码八为布局文件的内容,代码九则给出了Activity中onCreate函数中的内容,图2则给出了最终的效果图。这种情况下,能使用的HTML标记仅为<i>、<b>及<u>三种。

代码七:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello"><b>HelloWorld,</b><i>mynameis</i><u>clark</u>!</string>
  4. <stringname="app_name">MyString</string>
  5. </resources>

代码八:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/mystring"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/hello"
  12. />
  13. </LinearLayout>

代码九:

  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);
  4. }

图2:

b)字符串资源文件中使用转义HTML标记,同时使用Java代码对字符串资源进行转化。这里给出一个例子,代码十为文件strings.xml中的内容,代码十一为布局文件的内容,代码十二则给出了Activity中onCreate函数中的内容,其效果如图2所示。

代码十:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello"><b>HelloWorld,</b><i>mynameis</i><u>clark</u>!</string>
  4. <stringname="app_name">MyString</string>
  5. </resources>

代码十一:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/mystring"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text=""
  12. />
  13. </LinearLayout>

代码十二:

  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);
  4. TextViewmytext=(TextView)findViewById(R.id.mystring);
  5. Stringmyname=getString(R.string.hello);
  6. Spannedtextspan=Html.fromHtml(myname);
  7. mytext.setText(textspan);
  8. }

c)直接将HTML标记写入字符串资源中,同时使用Java代码对字符串资源进行转化。这里给出一个例子,代码七为文件strings.xml中的内容,代码十一为布局文件的内容,代码十三则给出了Activity中onCreate函数中的内容,其效果如图2所示。

代码十三:

  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);
  4. TextViewmytext=(TextView)findViewById(R.id.mystring);
  5. mytext.setText(getResources().getText(R.string.hello));
  6. }

d)字符串资源文件中使用纯文本字符串,同时使用Java代码对字符串资源进行转化。这里给出一个例子,代码十四为文件strings.xml中的内容,代码十五为布局文件的内容(注意,界面显示的是EditText),代码十六则给出了Activity中onCreate函数中的内容,其效果如图3所示。这里在定义字符串的时候也可以将其直接定义在Java代码中。

代码十四:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">HelloWorld,mynameisclark!</string>
  4. <stringname="app_name">MyString</string>
  5. </resources>

代码十五:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <EditText
  8. android:id="@+id/mystring"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text=""
  12. />
  13. </LinearLayout>

代码十六:

  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);
  4. EditTextmytext=(EditText)findViewById(R.id.mystring);
  5. mytext.setText(R.string.hello);
  6. Spannablespn=mytext.getText();
  7. spn.setSpan(newBackgroundColorSpan(Color.GRAY),0,11,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  8. mytext.setText(spn);
  9. }

图3:

4、样式字符串格式化

对样式字符串进行格式化,有以下几个步骤:

a)对字符串资源中的HTML标记进行转义。例如,&lt;b&gt;Hello World,&lt;/b&gt; &lt;i&gt;my name is&lt;/i&gt; &lt;u&gt;%1$s&lt;/u&gt;!

b) 按一般情况检索字符串资源。例如,getString(R.string.hello)。

c) 生成格式结果,确保转义你替换的任何字符串值,防止它们包含尖括号或&符号。例如,String.format(getString(R.string.hello),TextUtils.htmlEncode(name))。

d) 通过Html.fromHtml()将实体转义的HTML转换为Spanned对象。例如,Spanned textspan = Html.fromHtml(myname)。

这里给出一个例子,代码十七为文件strings.xml中的内容,代码十一为布局文件的内容,代码十八则给出了Activity中onCreate函数中的内容,其效果如图2所示。

代码十七:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello"><b>HelloWorld,</b><i>mynameis</i><u>%1$s</u>!</string>
  4. <stringname="app_name">MyString</string>
  5. </resources>

代码十八:

  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);
  4. TextViewmytext=(TextView)findViewById(R.id.mystring);
  5. Stringmyname=getString(R.string.hello);
  6. myname=String.format(myname,"clark");
  7. Spannedtextspan=Html.fromHtml(myname);
  8. mytext.setText(textspan);
  9. }

5、参考内容

(1)、http://book.douban.com/subject/5353163/

(2)、http://baike.baidu.com/view/5626871.html?fromTaglist

我的话费充值店-各种面额

电信100元仅售98.60
联通100仅售99.00
移动100仅售99.30

更多相关文章

  1. 微信接口 - android
  2. android 全志a10(2.3.4)开发三 (打包编译文件及生成最终烧录镜像)
  3. Android多国语言使用须知
  4. Android(安卓)Studio 导入 Android(安卓)源码
  5. Android(安卓)ADB 找不到 Devices 的解决方法
  6. Android(安卓)使用XML自定义菜单
  7. Android数据持久化,你还不会?
  8. Android中,怎么优雅的生成代码?
  9. 通过google接口在Android中实现天气预报效果

随机推荐

  1. 原YUV格式的解析 Android NV21 视频采集
  2. Android中TextView中加图片,超链接,一部分
  3. Android 监听短信接收 获取发件号码、短
  4. Android之开发杂记(一)
  5. Android DownloadManager 的使用
  6. 学习Android之setDataAndType(利用第三方
  7. Android 修改打包APP默认名称(app-release
  8. android 对比版本号
  9. 修改 ActivityManagerService.java 去掉
  10. Android开发 - 丰富常用的颜色文件colors