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