今天在公司遇到一个需求;TextView设置最多显示8个字符,超过部分显示...(省略号),网上找了很多资料,有人说分别设置TextView的android:signature="true",并且设置android:ellipsize="end";但是我试了,并没有成功,最后自己试出一种方式如下:供大家参考
- <TextView
- android:id="@+id/tv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:maxEms="18"
- android:singleLine="true"
- android:ellipsize="end"
- />
这里我们不说那些复杂的属性,光说我们通常用的比较多的,android:maxlength
官网API对其的解释为:
第一句,也就是说,他是个inputfilter(输入过滤器)他的作用是通过specified , number(你指定的数字)来限制text ,length(文本长度),这里特指的是文本长度,而无论我们输入什么内容,英文,符号,数字,汉字………………这些都属于文本范围,所以maxlength的作用就是直接限制显示的长度,
比如:
界面效果就是:
7个字母+3个汉字。
今天做到这里的时候发现不能单纯利用这个属性做限制,就看了别的,发现还有个maxEms的属性,官网对其的解释为:
第一句:翻译过来是使得textview的宽度不少于很多ems的宽度
What???????此时超级不理解ems是啥?反正绝对不能是邮政快递吧,很迷茫在网上查了下各种开发者的解释,如下:
这位说是限制字符数量,那么我的理解就是严格按照中文两个字符长度,字母占一个这样的规则,于是写了个例子进行测试,
界面结果是:
的确是自动换行了,但是第一行显示了7个字母加2个汉字,按照字节数来说的话应该是7+4=11才对啊,完全不是五个,但是往下看,第二行,是四个汉字加一个中文标点,10个字符长度,5个字符,莫非是这个意思?
然后我进行了下面几种测试:
第一行是10个a,我就想难道在这里,中文算1个字符长度,字母算半个?
继续测试
第一行显示的是25个字符(包含三个英文标点),阿西吧,刚刚建立的世界观就毁了,看来也不是这种计算方式。
继续测++:
到这里的时候我就欢乐了,应该就是指中文汉字数目吧,继续验证
我了个去…………第一行咋又出现了11个字呢………………
于是我从1开始验证到了18,发现如下不成规律的规律:
设你输入的参数为n, 屏幕显示的数量为m。
值为1-5时,m = n..
6-11时,m = n+1。
12-18时,m = n+2。
再大我就没测试了,因为屏幕放不下了……………………
基本是符合规律的,对于结果+1和+2,我的猜想是,汉字间是有间隙的,汉字一多,加上间隙,宽度就会增大。也只是猜想,再反过来看看API。
虽然还是不明白ems是什么,但是这里有个很重要的词,wide,宽度范围,而没有强调长度,那么我想应该就是字符在屏幕中所占的宽度了,既然这样,就和屏幕宽度和字体大小有直接的关系。
本文到此基本能结束了,相信大家也有点了解了,虽然我也不能确定自己的猜想是正确的,但是拿来用应该没问题了,但是我对这个方法还有点吐槽:
1, GoogleAPI会以汉字为基准吗?地位一下提高的感觉啊……
2, 对于ems这种英文符号,没有意义,我们该怎么猜测。
3, 在android条件下,各种分辨率,各种屏幕标准,山寨手机还喜欢篡改默认字体的情况下用这种空间布局属性实在不太好适配呀……有较大的局限性
4, 综上所述,这个属性和方法不好用……over。
我不知道自己的验证和理解到底对不对,还是我根本就理解错了,希望对此有更靠谱理解的大神多多指点,在此谢过。