Android之新版本的屬性在styles.xml中命名空間寫法

在作多語言適配的時候總會遇到一個很頭疼的問題:某些內容中文只有短短兩三個字,可翻譯成英文以後就是一連串的字符,若是TextView的寬度是wrap_content的話就會驟然變寬,把其它的控件擠到一邊,整個界面顯得特別凌亂。過去解決這種問題一般有兩種方案:android

  1. 固定TextView的寬高。保持了界面的美觀和統一,可是字符過長時會顯示不全;
  2. 爲每種語言都寫一個佈局。這樣能夠適配不一樣語言的佈局,可是因爲佈局過多,增長了後期的維護成本。

這兩種方法都有侷限,實際運用時問題也比較多。這時候你必定會想,假如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

打開values.xml文件

打開以後,搜索咱們用到的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>

再次編譯,成功經過了。

相關文章
相關標籤/搜索