在作多語言適配的時候總會遇到一個很頭疼的問題:某些內容中文只有短短兩三個字,可翻譯成英文以後就是一連串的字符,若是TextView的寬度是wrap_content
的話就會驟然變寬,把其它的控件擠到一邊,整個界面顯得特別凌亂。過去解決這種問題一般有兩種方案:android
這兩種方法都有侷限,實際運用時問題也比較多。這時候你必定會想,假如TextView裏面的文字可以根據TextView的寬高聰明地放縮就行了。那麼恭喜你,TextView的新特性Autosizeing
能夠知足你!app
(詳情參考這篇文章:文字太多?控件過小?試試 TextView 的新特性 Autosizeing 吧!)佈局
不過這麼好用的屬性是在Android 8.0以後推出,在版本低於8.0的手機上面的使用會有一點不同。首先你的Support包必須是26以上的,並且要使用AppCompatTextView
。佈局中的寫法以下:ui
<android.support.v7.widget.AppCompatTextView app:autoSizeTextType="uniform" app:autoSizeMinTextSize="12sp" app:autoSizeStepGranularity="2sp" app:autoSizeMaxTextSize="16sp" android:layout_width="wrap_content" android:layout_height="wrap_content" />
用法很簡單,可是每次都要去設置這幾個屬性的話未免有點煩了,最好的作法固然是將其封裝成一個style
,每次須要的時候去引用就能夠了。spa
一開始我是這樣寫的:.net
<style name="AutoTextStyle"> …… <item name="android:autoSizeTextType" tools:targetApi="o">uniform</item> <item name="android:autoSizeMaxTextSize" tools:targetApi="o">16sp</item> <item name="android:autoSizeMinTextSize" tools:targetApi="o">12sp</item> <item name="android:autoSizeStepGranularity" tools:targetApi="o">2sp</item> </style>
這樣顯然沒法在Android8.0如下的手機上奏效。因而我將命名空間換成了app:
,沒有提示語法錯誤,可是編譯時卻報出了以下的錯誤:翻譯
Error:(1296, 21) No resource found that matches the given name: attr 'app:autoSizeMaxTextSize'.
其餘的屬性也是這樣,說明在app:
這個命名空間下沒有這樣屬性。那麼命名空間應該怎麼寫呢?debug
根據博客styles.xml文件中@符號及命名空間android:的使用,在v7包中的屬性並非有android系統定義的,而是存在於當前工程之中。咱們能夠全局搜索一下values.xml,就是appbuildintermediatesappbuildintermediatesresdebugvalues下面的:code
打開以後,搜索咱們用到的TextView新屬性,果真找到了:orm
能夠看到它的前面是沒有命名空間的,另外三個屬性也是這樣,你們能夠自行查找一下。
回到咱們的styles.xml文件,去掉前面的app:
命名空間:
<style name="AutoTextStyle"> …… <item name="autoSizeTextType" >uniform</item> <item name="autoSizeMaxTextSize" >16sp</item> <item name="autoSizeMinTextSize" >12sp</item> <item name="autoSizeStepGranularity" >2sp</item> </style>
再次編譯,成功經過了。