我想在应用程序中指定自己的文本大小,但是这样做有问题。
当我在设备设置中TextView
更改字体大小时,我的应用程序的字体大小也会更改。
我想在应用程序中指定自己的文本大小,但是这样做有问题。
当我在设备设置中TextView
更改字体大小时,我的应用程序的字体大小也会更改。
Answers:
使用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
,系统使用默认值。
防止整个应用程序受系统字体大小影响的一种简单方法是使用基本活动进行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());
}
这可能会有所帮助。在您的自定义Application或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;
}
但是,在API级别25中复制了Resource#updateConfiguration,这意味着将来某天将不支持该资源。
您可以使用以下代码:
android:textSize="32dp"
它可以解决您的问题,但您必须知道应该尊重用户的决定。这样,从设备设置更改文本大小不会更改此值。所以这就是为什么您需要使用sp而不是dp的原因。因此,我的建议是使用不同的系统字体大小(小,标准,大,...)查看您的应用
如果使用的单位是SP,而不是DP,并且您想覆盖系统字体缩放,那么您要做的就是覆盖活动中的一种方法- 请参阅此文章。
resources.updateConfiguration已弃用且存在错误(在Oreo上,我遇到了格式化文本的问题)。
在android 8这个解决方案为我工作
在基本活动中添加此代码
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
final Configuration override = new Configuration(newBase.getResources().getConfiguration());
override.fontScale = 1.0f;
applyOverrideConfiguration(override);
}