今天测试小姐姐告诉我,切换英文的时候你这里显示“Total 99 picture”不对,应该是“Total 99 pictures”,要复数。不得不说测试小姐姐也是很细心的,好在问题不大,很快就给你改好了。脑子一过解决方案就是判断数字大小来选取单复数,说干就干,但是刚写下if
就发现事情并不那么简单,假如有n个位置的数字要改变,那我就要写n个if...else...来选取单复数,真是令人头大,想想谷歌肯定不会这么干的,搜罗一番在这总结一下。
java给我们安排了两个重载的format方法:
format(String format, Object... args)
format(Locale l, String format, Object... args) 第一个参数指定了输出的语言。
举个栗子:
textView.setText(String.format("我是练习时长%d年的个人练习生%s,喜欢%s,%s,%s。",2,"小明","唱","跳","rap"));
这样一个Textview就可以完成工作了,这里%d是整形占位符,%s是字符串占位符。关于各种各样的占位符可以参考这篇文章:
java各种占位符的使用
使用strings.xml相对于直接写在代码里的好处就是方便维护以及复用。常规操作,举个栗子:
在资源文件创建字符串:
我是练习时长%d年的个人练习生%s,喜欢%s,%s,%s。
然后调用使用getString方法
textView.setText(getString(R.string.example,2,"李华","唱","跳","rap"));
这样李华也喜欢 唱,跳和rap了。
这里想要提一下,还有另外的一种写法,就是创建字符串的时候不一样,getString的写法不变。
我是练习时长%1$d年的个人练习生%2$s,喜欢%3$s,%4$s,%5$s。
运行出来的结果都是一样的,%1$d这里的“1”表示第一个参数,代表序号,还是整形占位符。网上很多文章都喜欢这样写,一个占位符就使用%d,多个占位符就加上序号%1$d,%2$s.....,然而我发现多个占位符不用序号也是可行的,getString()方法直接匹配好了,这就显得添加序号多此一举了。这些是我的个人理解,要是添加序号的写法还有什么我不知道的小秘密,请各位不吝赐教,留言告诉我。
在字符串资源文件中有plurals这么个标签可以实现单复数选择,先举个栗子再慢慢解释:
- Total %d books
不同语言的语法对于单复数的定义不同,我们中文没有单复数可,英语则不一样,有单复数使用,plurals标签就方便的提供了区分的方法。quantity属性有:zero、one、two、few、many、other,选择哪一个依特定语法而定,中文没有单复数区分,可以用other,如上。
英文有单复数之分可以这样写:
- Total %d book
- Total %d books
那么用起来也很简单 :
textView.setText(getResources().getQuantityString(R.plurals.example_book_count, 1,1));
getQuantityString有两个重载的方法:
getQuantityString(@PluralsRes int id, int quantity, Object... formatArgs)
getQuantityString(@PluralsRes int id, int quantity)
第一个参数是资源id;第二个参数就是判断单复数的依据数字,例如传入“1”,在英文环境下就会选用quantity = “one”的字符串;第三个参数是占位符的数据,可以传入多个。
在英文环境下试一下:
textView.setText(getResources().getQuantityString(R.plurals.example_book_count, 1,1));
textView2.setText(getResources().getQuantityString(R.plurals.example_book_count,10086,10086));
这样就可以解决引言中的问题了。
不停思(zuo)考(si),才能不停进步。本来到上文就能解决掉我遇到的问题了,进而一想,还有一些更加复杂的情况怎么解决,比如一些加了特技的,文字大小,文字带颜色,有背景等等,一个textview又怎么实现。查阅还有带入html的方式实现。参考一下
html实现
SpannableString其实和String一样,都是一种字符串类型,可以实现很多漂亮的效果。有几篇文章讲的很详细:
参考:安卓开发中SpannableString之富文本显示效果
Android UI——SpannableString详细解析