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>

再次编译,成功经过了。

相关文章
相关标签/搜索