我想在我的应用程序中指定我自己的文本大小,但我这样做有一个问题。
当我在设备设置中改变字体大小时,我的应用程序TextView的字体大小也会改变。
我想在我的应用程序中指定我自己的文本大小,但我这样做有一个问题。
当我在设备设置中改变字体大小时,我的应用程序TextView的字体大小也会改变。
当前回答
如果使用的单位是SP,而不是DP,并且你想覆盖系统字体缩放,你所要做的就是覆盖activity中的一个方法——请看这篇文章。
资源。updateConfiguration已弃用且有bug(在Oreo上,我有格式化文本的问题)。
其他回答
防止整个应用程序受到系统字体大小影响的简单方法是使用一个基本活动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());
}
实际上,设置字体大小只影响sp中的大小。所以你所需要做的-在dp中定义textSize而不是sp,然后设置不会改变应用程序中的文本大小。
这里是文档的链接:Dimensions
但是请注意,预期的行为是所有应用程序中的字体都尊重用户的偏好。用户可能有很多原因想要调整字体大小,其中一些甚至可能是医疗视力受损的用户。使用dp而不是sp作为文本可能会导致不情愿地歧视你的应用程序的一些用户。
即:
android:textSize="32dp"
将DP更改为sp,这是android的良好实践 android: textSize = " 18 sp "
这可能会有所帮助。将代码添加到您的自定义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;
}
然而,Resource#updateConfiguration是在API级别25中部署的,这意味着在未来的某一天它将不受支持。
在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);
}
源 https://stackoverflow.com/a/57225687/7985871