关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题
一.發(fā)現(xiàn)問題
問題:最近公司測試同學,在無意間調(diào)整系統(tǒng)字體大小的之后把app從后臺切換到前臺,發(fā)現(xiàn)app crash。
查閱了一些資料,發(fā)現(xiàn)在app中文字標注的單位為sp。當系統(tǒng)字體大小發(fā)生變化的時候sp的度量標準發(fā)生了變化,這個時候,系統(tǒng)會給app發(fā)送一個通知,告訴它配置已經(jīng)變了,需要重新刷新界面。類似的操作就像是橫豎屏切換,在onConfigurationChanged()方法里面進行需要的操作的配置。
橫豎屏切換,app走的生命周期方法是onDestroy(),onCreate()。一般我們的應(yīng)用通常配置是設(shè)定一個固定的方向讓它避免橫豎屏切換。通過配置configChanges屬性,防止界面的銷毀和重建。
android:screenOrientation="portrait" android:configChanges="orientation|screenSize|keyboardHidden回到問題本身,發(fā)生問題的原理是這樣的:系統(tǒng)字體大小發(fā)生了變化,它在app回到前臺的時候發(fā)送了一個通知告訴app。app此時走的生命周期的方法是
onDestroy()onCreate()onResume()通過這樣的操作進行UI界面的刷新。
重點來了:此時app是作為一種異常走的onDestroy()方法,并不是正常的按返回鍵進行的退出執(zhí)行的onDestroy()。這個時候系統(tǒng)會自動在onSaveInstanceState()方法里面臨時性的保存之前的界面狀態(tài)或者變量信息。方便在onCreate()的時候,從bundle里面直接取出來使用。但是畢竟是異常的狀態(tài),有些實體的信息或者fragment堆棧的狀態(tài)恢復(fù)的時候就有可能錯亂,導(dǎo)致顯示效果出錯或者crash。
二.解決方法
android:configChanges="orientation|screenSize|keyboardHidden|**fontScale**1.添加fontScale屬性,避免系統(tǒng)字體發(fā)生變化的時候,重新create界面。如果僅僅這樣處理,app的在從后臺切換到前臺的時候,字體會隨著系統(tǒng)的字體大小發(fā)生變化。
2.把app里面字體的單位,由sp改為dp,這樣,app的字體展示就不會隨著系統(tǒng)的字體變化而發(fā)生變化。
可以根據(jù)產(chǎn)品的需要自行進行配置。
三.引申思考
解決完上面的問題了,有善于思考的同學就問了,這個是解決切換系統(tǒng)的字體大小產(chǎn)生的問題,如果我切換系統(tǒng)字體的樣式呢?出現(xiàn)問題又該怎么解決?
其實有了上面的基礎(chǔ),解決這個問題就容易的多了。
在切換字體大小的時候,我們知道系統(tǒng)會發(fā)送通知,我們設(shè)置fontScale屬性就可以了。但是切換字體的樣式,系統(tǒng)并沒有通知,谷歌官方也沒有,stack上也是各種提問,沒有找到監(jiān)聽的事件或者方法。
切換樣式之后,我們可以觀察一下Activity的生命周期,依然是onDestroy(),onCreate()….因為是異常的destroy,系統(tǒng)會把當前的狀態(tài)信息存入saveInstanceState()方法里面的bundle,onCreate()的時候,從bundle里面取出來進行恢復(fù)。有時候,保存的bundle狀態(tài)不對,導(dǎo)致界面加載錯亂。
解決的方法:
在onCreate()的時候,判斷bundle里面是否有數(shù)據(jù),如果有數(shù)據(jù),進行賦空處理,然后走一遍正常的流程,就可以了。具體代碼如下:
這個配置可以放在項目的BaseActivity里面,可以減少對現(xiàn)有代碼的改動。
思考:其實這個時候,你會發(fā)現(xiàn),在切換字體大小的時候,也可以這樣配置,甚至這樣配置之后就不用管fontScale之類的屬性了,讓界面自己刷新去吧,反正第二次的onCreate()跟重新進入app效果是一樣的。
四.小結(jié)
博主最近才開始寫博客,記錄一些工作中遇到的坑,分享出來讓做開發(fā)的小伙伴們能快速的繞過這些坑,提高效率。如果文章有不對的地方,請幫忙指正出來,謝謝。
當時查閱的資料網(wǎng)址也感謝其他博主的無私分享:
http://blog.csdn.net/murphykwu/article/details/24774015
http://blog.csdn.net/zhuqiang1002/article/details/38756127
如果覺得有幫助,可以加我好友,拉你進去技術(shù)討論群,共同進步
總結(jié)
以上是生活随笔為你收集整理的关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 手机屏幕熄灭,传感器会失
- 下一篇: Android 实现App修改应用图标