開發過程中,按照UI設計尺寸做好UI頁面,當用戶自定義自己的手機字體大小之后UI完全沒法看了,這個時候就在想讓app字體大小始終一致就好了
下面看一下,出現的問題和解決方案


做個簡單的例子,先驗證一下:
同樣的布局代碼
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:text="Hello World! in SP" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" android:text="Hello World! in DP" />
調節設置中顯示字體大小

運行后顯示樣式

回到標題要解決的問題,如果要像微信一樣,所有字體都不允許隨系統調節而發生大小變化,要怎么辦呢?利用Android的Configuration類中的fontScale屬性,其默認值為1,會隨系統調節字體大小而發生變化,如果我們強制讓其等於默認值,就可以實現字體不隨調節改變,在工程的Application或BaseActivity中添加下面的代碼:
解決方案:
//字體適配解決方案
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig.fontScale != 1)//非默認值
getResources();
super.onConfigurationChanged(newConfig);
}
@Override
public Resources getResources() {
Resources res = super.getResources();
if (res.getConfiguration().fontScale != 1) {//非默認值
Configuration newConfig = new Configuration();
newConfig.setToDefaults();//設置默認
res.updateConfiguration(newConfig, res.getDisplayMetrics());
}
return res;
}
總結:
一是布局寬高固定的情況下,字體單位改用dp表示;
注意,如果使用的sp,還是會隨用戶的字體大小的改變而改變,所以這里使用dp設置
二是通過3中的代碼設置應用不能隨系統調節,在檢測到fontScale屬性不為默認值1的情況下,強行進行改變。