我希望在我的应用程序中指定自己的文本大小,但我在这方面遇到了问题。
当我更改设备设置中的字体大小时,我的应用程序 TextView
的字体大小也会更改。
我希望在我的应用程序中指定自己的文本大小,但我在这方面遇到了问题。
当我更改设备设置中的字体大小时,我的应用程序 TextView
的字体大小也会更改。
sp
中的大小。所以您需要做的就是将textSize
定义为dp
,而不是sp
,这样设置就不会改变您应用中的文本大小。dp
而不是sp
可能会导致您的应用程序无意中歧视某些用户。android:textSize="32dp"
像使用string
资源一样使用dimension
类型的资源(文档)。
在你的dimens.xml
文件中声明你的尺寸变量:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textview_height">25dp</dimen>
<dimen name="textview_width">150dp</dimen>
<dimen name="ball_radius">30dp</dimen>
<dimen name="font_size">16sp</dimen>
</resources>
那么您可以像这样使用这些值:
<TextView
android:layout_height="@dimen/textview_height"
android:layout_width="@dimen/textview_width"
android:textSize="@dimen/font_size"/>
dimens.xml
文件。
这样做将确保您的应用在不同设备上呈现所需的外观。android:textSize
时,系统使用默认值。请注意,如果在代码中设置了textSize,则调用textView.setTextSize(X)
会将数字(X)解释为SP。使用setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)
以dp单位设置值。
当在dimen.xml文件中定义了DIP或SP时,在代码中再次指定这些值并不是一件好事。
我认为在使用dimen.xml值时,最好的选择是使用PX:
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
这样,您可以在dimen.xml文件中根据需要从DP切换到SP,而无需更改任何代码。
通过使用基础活动并更新配置(updateConfiguration),可以简单地防止整个应用程序受到系统字体大小的影响。
//in base activity add this code.
public void adjustFontScale( Configuration configuration) {
configuration.fontScale = (float) 1.0;
DisplayMetrics metrics = getResources().getDisplayMetrics();
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.fontScale * metrics.density;
getBaseContext().getResources().updateConfiguration(configuration, metrics);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adjustFontScale( getResources().getConfiguration());
}
android:textSize="32dp"
IT技术可以解决你的问题,但你必须尊重用户的决定。因此,从设备设置更改文本大小不会改变该值。这就是为什么你需要使用 sp 而不是 dp 的原因。
因此,我的建议是使用不同的系统字体大小(小号、正常、大号等)来审查你的应用程序。
这个解决方案使用 Kotlin 编写,并且没有使用过时的函数 resources.updateConfiguration。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
adjustFontScale(resources.configuration)
}
private fun adjustFontScale(configuration: Configuration?) {
configuration?.let {
it.fontScale = 1.0F
val metrics: DisplayMetrics = resources.displayMetrics
val wm: WindowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
wm.defaultDisplay.getMetrics(metrics)
metrics.scaledDensity = configuration.fontScale * metrics.density
baseContext.applicationContext.createConfigurationContext(it)
baseContext.resources.displayMetrics.setTo(metrics)
}
}
观察:这是与上述相同的解决方案,但已更新为Kotlin
priceTextView.textSize = 12f
/**
* 重写 getResource 方法,防止系统字体影响
*
* @return
*/
@Override
public Resources getResources() {
Resources resources = super.getResources();
if (resources != null && resources.getConfiguration().fontScale != 1) {
Configuration configuration = resources.getConfiguration();
configuration.fontScale = 1;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
然而,API 25已经弃用了Resource#updateConfiguration功能,这意味着它在未来某一天将不再受支持。