在APP中钠四,字體的大小單位一般會用sp盗扒,然而在改變系統(tǒng)字體大小時,App字體就會隨著系統(tǒng)字體大小改變而改變缀去,這就可能造成APP布局的錯位侣灶。
造成這種情況的原因是,sp單位除了受屏幕密度影響外缕碎,還受到用戶的字體大小影響褥影,通常情況下,建議使用sp來跟隨用戶字體大小設置咏雌。除非一些特殊的情況,不想跟隨系統(tǒng)字體變化的凡怎,可以使用dp”。按照這么說处嫌,布局寬高固定寫死的地方應該統(tǒng)一用dp顯示字體栅贴,因為一旦用戶在設置中調大字體,寬高寫死的布局顯示就亂了熏迹。
針對這種情況檐薯,查找網上的方法也很多,大多是這樣的方法 (重寫 Application 或 BaseActivity 中的方法):
/**
* 重寫 getResource 方法注暗,防止系統(tǒng)字體影響
*/
@Override
public Resources getResources() {//禁止app字體大小跟隨系統(tǒng)字體大小調節(jié)
Resources resources = super.getResources();
Configuration configuration = new Configuration();
configuration.setToDefaults();
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return resources;
}
從上代碼可以看出Configuration是new出來的對象坛缕,那么系統(tǒng)中原本自帶的許多屬性可能就遺失了。在大多數(shù)的情況下捆昏,我們不會察覺到這樣的差異赚楚。但是在某些情況下,發(fā)現(xiàn)出現(xiàn)了空指針骗卜;還有就是宠页,configuration.setToDefaults()時左胞,會把所有屬性都設置成系統(tǒng)默認,對于有特殊需求的 app 來說是不合理的举户,這里應該只修改字體大小的設置烤宙。
在此就不再多做贅述,最總解決辦法是在Application中重寫getResources()方法:
/**
* 重寫 getResource 方法俭嘁,防止系統(tǒng)字體影響
*/
@Override
public Resources getResources() {//禁止app字體大小跟隨系統(tǒng)字體大小調節(jié)
Resources resources = super.getResources();
if (resources != null && resources.getConfiguration().fontScale != 1.0f) {
android.content.res.Configuration configuration = resources.getConfiguration();
configuration.fontScale = 1.0f;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
兩者代碼的不同之處躺枕,請自行比較吧!
滿心歡喜的以為問題就這么愉快地解決了供填。將app放在Android8.0上運行拐云,然后將手機的字體設置成最大后發(fā)現(xiàn),問題并沒有解決近她。這時還需要在BaseActivity中同樣進行重寫getResources()方法叉瘩。這樣當前字體大小的問題就可以解決了。
到這里問題應該是解決了泄私,驚奇的發(fā)現(xiàn)Android 8.0的手機不單單有字體大小設置房揭,還有一項顯示模式 , 將顯示模式設成最大后晌端,發(fā)現(xiàn)app的界面超出了屏幕捅暴。(注:部分Android7.0手機也會有顯示模式這一項,但是將顯示模式設置成最大咧纠,不會影響app的界面的蓬痒,只有Android8.0及其以上才會出現(xiàn)這種情況)。
?
?
注:目前這種情況我還沒有找到解決的辦法漆羔,有了解決辦法梧奢,我會在這個博客更新,大神們有解決辦法還望留言告知我演痒,大家相互分享亲轨。