日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题

發(fā)布時間:2023/12/31 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一.發(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ù),進行賦空處理,然后走一遍正常的流程,就可以了。具體代碼如下:

@Overrideprotected void onCreate(Bundle savedInstanceState) {**if (null != savedInstanceState)savedInstanceState = null;**super.onCreate(savedInstanceState);}

這個配置可以放在項目的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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。