我想在我的应用程序中指定自己的文本大小,但是我在执行此操作时遇到了问题。
当我在设备设置中更改字体大小时,我的应用程序TextView
的字体大小也会发生变化。
实际上,“设置”字体大小仅影响sp
中的大小。所以你需要做的 - 在textSize
中定义dp
而不是sp
,然后设置不会改变你的应用程序中的文本大小。
这是文档的链接:Dimensions
但请注意,预期的行为是所有应用程序中的字体都尊重用户的首选项。用户可能想要调整字体大小的原因有很多,其中一些甚至可能是医学视觉障碍用户。使用dp
而不是sp
文本可能导致不情愿地歧视您的某些应用程序的用户。
即:
android:textSize="32dp"
如果使用的单位是SP而不是DP,并且您想要覆盖系统字体缩放,那么您所做的只是覆盖活动中的一个方法 - see this post。
不推荐使用resources.updateConfiguration和buggy(在Oreo上我遇到了格式化文本的问题)。
您可以使用此代码:
android:textSize="32dp"
它解决了您的问题,但您必须知道您应该尊重用户的决定。这样,从设备设置更改文本大小不会更改此值。这就是为什么你需要使用sp而不是dp。所以我的建议是用不同的系统字体大小(小,正常,大,......)来检查你的应用程序
在Activity中覆盖getResources()
。
像往常一样像android:textSize="32sp"
一样在sp中设置TextView的大小
override fun getResources(): Resources {
return super.getResources().apply {
configuration.fontScale = 1F
updateConfiguration(configuration, displayMetrics)
}
}
最简单的方法就是使用如下内容:
android:textSize="32sp"
如果您想了解更多有关textSize
财产的信息,可以查看Android developer documentation。
使用dimension
类型的资源,比如你使用string
资源(DOCS)。
在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,而无需更改任何代码。
防止整个应用程序受系统字体大小影响的简单方法是使用基本活动更新配置。
//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());
}
使用DP中的字体大小而不是textSize
中的SP解决了这个问题。
这可能有所帮助。在自定义应用程序或BaseActivity中添加代码
/**
* 重写 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;
}
但是,Resource#updateConfiguration在API级别25中被删除,这意味着将来某天将不支持它。
您必须使用XML编写TextView标记:
android:textSize="32dp"