如何为hdpi及以下像素密度屏幕指定TextView的12sp字号?
解决Android中仅HDPI及更低密度屏幕设置特定字号的问题
你的问题出在Android资源匹配的 fallback 机制上:当你只在values-hdpi里定义了text_size这个dimen,而默认的values目录下没有对应的定义时,更高密度的设备(比如xhdpi、xxhdpi)会因为找不到自身密度对应的dimen,自动 fallback 到values-hdpi中的资源,导致所有屏幕都显示12sp。
要实现「仅HDPI及更低密度用12sp,其余用系统默认字号」的需求,推荐用样式+密度限定符的方案,具体步骤如下:
步骤1:创建基础样式(默认values目录)
在res/values/styles.xml中定义一个不包含textSize的基础样式,让高密设备使用系统默认字号:
<style name="VersionTextStyle"> <!-- 不设置textSize,继承系统TextView的默认样式属性 --> </style>
步骤2:为低密设备创建带字号的样式
分别在res/values-ldpi/styles.xml、res/values-mdpi/styles.xml、res/values-hdpi/styles.xml这三个目录中创建同名样式,指定12sp的字号:
<style name="VersionTextStyle"> <item name="android:textSize">12sp</item> </style>
(如果这几个目录不存在,直接新建即可,Android Studio会自动识别密度限定符)
步骤3:修改TextView引用样式
把原来TextView中直接引用textSize的代码,改成引用我们定义的样式:
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/version_text" style="@style/VersionTextStyle" />
这样一来,当设备是ldpi、mdpi、hdpi时,会加载对应密度目录下带textSize的样式,显示12sp;而xhdpi及更高密度的设备会加载默认values目录下的基础样式,自动使用系统默认的TextView字号,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Nicolae Stroncea
相关产品推荐
相关产品推荐

