可替换string的使用 & <xliff:g>标签介绍

来源:互联网 发布:mac vim insert 编辑:程序博客网 时间:2024/05/17 03:01


2014-1-9号补充:

如果你看过Android的原生代码,就会发现,在string.xml中大量使用了这些标签:

    <string name="delete_bookmark_warning">Delete bookmark \"<xliff:g id="bookmark">%s</xliff:g>\"?</string>

<xliff:g>标签介绍:

<string name="appwidget_text_format"><xliff:g id="prefix">%1$s</xliff:g>: <xliff:g id="time">%2$s</xliff:g></string>

这个主要用于程序中,动态的插入内容时候使用,例如,
<string name="time">当前时间:<xliff:g id="prefix">%1$s</xliff:g>时 <xliff:g id="time">%2$s</xliff:g>分</string>
然后通过程序,context.getString(R.string.time,"10","05");
将会输出——当前时间:10时05分
 


属性id可以随便命名 
属性example表示举例说明,可以省略 
%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格 
%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0 
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00


定义可变的字符串:

当一个字符串中只包含一个可变的数
例如这样:
<string name="tedst"> %d首歌曲。</string>这样正确的
当一个字符串中只包含多个可变的数
例如:
<string name="tedst">%d张专辑 %d首歌曲。</string>,这样是错误的
当你字符串中包含多个 %d,需要用xliff:g来格式化字符串
首先我们必须要添加这样一句
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
像这样:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="test"> 第 <xliff:g> %d</xliff:g>张专辑,第<xliff:g> %d</xliff:g>首歌曲。</string>
</resources>
代码使用都是同一种方法:
        Resources res=this.getResources();
        int albumNum=2,songNum=6;
        String get=res.getString(R.string.test, albumNum,songNum);
        Log.e(TAG, get);



///////////////////////////////////////////////////////////////////////////////////////////// 华丽的分割线


1.String content1 = VarComponent.getRootActivity().getResources().getString(R.string.message_friend_request);
 String content = String.format(content1, Variables.user_name.toString());
 
 2. String content = VarComponent.getRootActivity().getResources().getString(R.string.message_friend_request, Variables.user_name);

上面2种方式都可以的,getString(  ,   );这个虽然有2个参数,其实底层调的仍然是String.format( , );           

问题的关键在于我们的string.xml中的字符串的写法:     

中文:  <string name="message_friend_request">我是%1$s,想加你为好友。</string>      

英文: <string name="message_friend_request">I am %1$s, I want to be a friend with you.</string>

具体的看下面的一堆解释。

             

我们是这样写的:出了个bug,才知道原来还可以这样用啊。

getResources().getString(R.string.message_friend_request, Variables.user_name);

其实,底层的原理就是利用String.Format();

所以可以使用java的格式化方式,调用String.Format();


在android的开发中,经常会遇见一句话,比如“我出生于1989年”;这个1989需要在程序中生成,但是遇到一个问题,这完整的一句话是一个TextView中的,而不是三个textView拼接成的,而且是引用的string.xml文件中写好的;使用字符串拼接也可以实现,但是特别麻烦;

今天遇到一个好方法,在string.xml中,不仅可以设置文字的格式换行等,还可以设置类似于变量的文本格式;

1、整型,比如“我出生于1989年”,这个1989是整型的。在string.xml中可以这样写,<string name="old">我出生于%1$d</string>

在程序中,使用

String birth = getResources().getString(R.string.old);

String sbirth = String.format(birth, 1989);

将%1$d替换为23;

%1$d表达的意思是整个name=”birth”中,第一个整型的替代。如果一个name中有两个需要替换的整型内容,则第二个写为:%2$d,以此类推;具体程序中替换见下面的string型;

2、string型,比如“我出生于1989年,我今年22岁了”;这里的“1989”和“22”都需要替换。

在string.xml中可以这样写,<string name="alert">我出生于%1$d年,我今年%2$d岁了</string>

在程序中:

String birth = getResources().getString(R.string.alert);  
String sbirth = String.format(sAgeFormat1, "1989","22");

这里两个string需要替换的,按照上面程序的顺序依次对应。



在Android的string.xml可以配置部分可替换的String:
1,resrouces标签中增加属性xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"
2,string值中添加<xliff:g id="kk">%s</xliff:g>,其中%s表示替换部分
3,程序中使用Resources.getString(int id, Object... formatArgs)获取替换后的string
4,getString可以替换不定数目的值,如果在xml配了n个变量,这里必须有>=n个替换项

更简单地,在2.3中直接用Context.getString就可以读取含%s的String 




<b></b>加粗字体



<i></i> 斜体字体



<u></u> 给字体加下划线



\n 换行


\u0020表示空格


\u2026表示省略号


使用&lt;b>和&lt;b>来打印出<b></b> 这样的文字;“&lt;”表示“<”的意思;


使用textView.setText(Html.fromHtml("Hello <b>World</b>,<font size=\"3\" color=\"red\">AnalysisXmlActivty!</font>"));设置类似于html那样的效果


如果你需要使用 String.format(String, Object...) 来格式化你的字符串,你可以把格式化参数放在你的字符串中,参见下面的例子:



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



在这个例子中,这个格式化的字符串有2个参数, %1$s是个字符串 %2$d 是个浮点数,你可以在你的程序中按照下面的方法来根据参数来格式化字符串:


Resources res = getResources();


String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);


那么根据例子上说的我需要把%s换成%1$s才行了,修改后编译通过,程序成功启动。


问题补充:如何在<string></string>中使用%号



有两个办法可供选择


1.用%%来表示1个%,和转意符号 \ 的用法相同



2.如果你的字符串不需要格式化,可以在你的<string 标签上增加一个属性:formatted="false"例如 <string name="test" formatted="false">% test %</string> 即可


下面主要介绍android文本资源文件/res/values/strings.xml中xliff标签。


预备知识:


1、什么是xliff?


参照http://baike.baidu.com/view/4160854.htm。



2、java格式化字符串有哪些?


参照http://wenku.baidu.com/view/56f3ed0e52ea551810a687eb.html,写的很详细。



3、android中获取资源文件getString()方法


该方法有两种形式,getString(int resId)和getString(int resId,object arg1,object arg2,...)。


下面主要介绍的是第二种形式,即getString(int resId,object arg1,object arg2,...)。



开始今天的主题:


先看一个strings.xml的定义:


<?xml version="1.0" encoding="utf-8"?>


<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">


<string name="name">我叫<xliff:g id="id1" example="tom">%1$s</xliff:g>身高<xliff:g id="id2" example="170">%2$d</xliff:g>CM</string>


</resources>


该文件与普通文件的区别:


1、具有命名空间xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2",这个必须要有。


2、在<string>标签中含有<xliff:g>标签。


<xliff:g>标签介绍:


属性id可以随便命名


属性example表示举例说明,可以省略


%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格


%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0


%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00


更多参照预备知识2中的java格式化字符串



举例说明:


针对上面的strings.xml文件,在代码里这样表示


TextView txt = new TextView(this);


txt.setText(getString(R.string.name),"android",180);


输出结果为:我叫android身高180CM



OK,以上希望对看帖的人有帮助。如有不对或需要补充的地方请指出。


我们是这样写的:出了个bug,才知道原来还可以这样用啊。

getResources().getString(R.string.message_friend_request, Variables.user_name);

原创粉丝点击