今天在公司遇到一個需求;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。
我不知道自己的驗證和理解到底對不對,還是我根本就理解錯了,希望對此有更靠譜理解的大神多多指點,在此謝過。
