android sp单位会随着系统字体大小而改变,当用户把系统字体大小调成最大时,往往会造成文字充满整个布局,或显示不全,给用户的体验相当差。
在base或application里面重写父类方法 getResources()
public Resources getResources() { if (this.mResources == null && VectorEnabledTintResources.shouldBeUsed()) { this.mResources = new VectorEnabledTintResources(this, super.getResources()); } return this.mResources == null ? super.getResources() : this.mResources; }
和onConfigurationChanged()方法
public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); this.getDelegate().onConfigurationChanged(newConfig); if (this.mResources != null) { DisplayMetrics newMetrics = super.getResources().getDisplayMetrics(); this.mResources.updateConfiguration(newConfig, newMetrics); } }
因为个人原因,比较喜好小号字体,0.86,我这边就0.86举例重写以上两个方法
@Override public Resources getResources() { Resources resources = super.getResources(); //判断当前的字体是否为自己想要的字体大小 if (resources.getConfiguration().fontScale != 0.86){ //如果不是new一个Configuration类,添加自己想要的属性,并让 resources.updateConfiguration。 Configuration configuration = new Configuration(); configuration.fontScale = 0.86f; configuration.setTo(configuration); resources.updateConfiguration(configuration,resources.getDisplayMetrics()); } //返回resources return resources; }
重写onConfigurationChanged,监听了系统变化,这个方法会执行多次
@Override public void onConfigurationChanged(Configuration newConfig) { //当fontScale != 0.86f,执行我们重写的getResources();方法 if (newConfig.fontScale != 0.86f){ getResources(); } super.onConfigurationChanged(newConfig); }