Android 复合字符串

引言:


今天测试小姐姐告诉我,切换英文的时候你这里显示“Total 99 picture”不对,应该是“Total 99 pictures”,要复数。不得不说测试小姐姐也是很细心的,好在问题不大,很快就给你改好了。脑子一过解决方案就是判断数字大小来选取单复数,说干就干,但是刚写下if
就发现事情并不那么简单,假如有n个位置的数字要改变,那我就要写n个if...else...来选取单复数,真是令人头大,想想谷歌肯定不会这么干的,搜罗一番在这总结一下。

1、格式化

1.1、format()格式化

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各种占位符的使用

1.2、字符串资源格式化

1.2.1、简单的字符串资源格式化

使用strings.xml相对于直接写在代码里的好处就是方便维护以及复用。常规操作,举个栗子:

在资源文件创建字符串:

<string name="example">
        我是练习时长%d年的个人练习生%s,喜欢%s,%s,%s。
</string>

 然后调用使用getString方法

textView.setText(getString(R.string.example,2,"李华","唱","跳","rap"));

这样李华也喜欢 唱,跳和rap了。

 这里想要提一下,还有另外的一种写法,就是创建字符串的时候不一样,getString的写法不变。

<string name="example2">
        我是练习时长%1$d年的个人练习生%2$s,喜欢%3$s,%4$s,%5$s。
</string>

运行出来的结果都是一样的,%1$d这里的“1”表示第一个参数,代表序号,还是整形占位符。网上很多文章都喜欢这样写,一个占位符就使用%d,多个占位符就加上序号%1$d,%2$s.....,然而我发现多个占位符不用序号也是可行的,getString()方法直接匹配好了,这就显得添加序号多此一举了。这些是我的个人理解,要是添加序号的写法还有什么我不知道的小秘密,请各位不吝赐教,留言告诉我。

1.2.2、带单位变换的字符串资源格式化

在字符串资源文件中有plurals这么个标签可以实现单复数选择,先举个栗子再慢慢解释:

<plurals name="example_book_count">
    <item quantity="other">Total %d books</item>
</plurals>

不同语言的语法对于单复数的定义不同,我们中文没有单复数可,英语则不一样,有单复数使用,plurals标签就方便的提供了区分的方法。quantity属性有:zero、one、two、few、many、other,选择哪一个依特定语法而定,中文没有单复数区分,可以用other,如上。

英文有单复数之分可以这样写:

<plurals name="example_book_count">
     <item quantity="one">Total %d book</item>
     <item quantity="other">Total %d books</item>
</plurals>

那么用起来也很简单 :

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));

这样就可以解决引言中的问题了。

1.2.3、带Html的字符串资源格式化

不停思(zuo)考(si),才能不停进步。本来到上文就能解决掉我遇到的问题了,进而一想,还有一些更加复杂的情况怎么解决,比如一些加了特技的,文字大小,文字带颜色,有背景等等,一个textview又怎么实现。查阅还有带入html的方式实现。参考一下

html实现

2、SpannableString

SpannableString其实和String一样,都是一种字符串类型,可以实现很多漂亮的效果。有几篇文章讲的很详细:

参考:安卓开发中SpannableString之富文本显示效果

           Android UI——SpannableString详细解析

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值