在作多语言适配的时候总会遇到一个很头疼的问题:某些内容中文只有短短两三个字,可翻译成英文以后就是一连串的字符,若是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>
再次编译,成功经过了。