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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

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

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

一.發(fā)現(xiàn)問(wèn)題

問(wèn)題:最近公司測(cè)試同學(xué),在無(wú)意間調(diào)整系統(tǒng)字體大小的之后把a(bǔ)pp從后臺(tái)切換到前臺(tái),發(fā)現(xiàn)app crash。

查閱了一些資料,發(fā)現(xiàn)在app中文字標(biāo)注的單位為sp。當(dāng)系統(tǒng)字體大小發(fā)生變化的時(shí)候sp的度量標(biāo)準(zhǔn)發(fā)生了變化,這個(gè)時(shí)候,系統(tǒng)會(huì)給app發(fā)送一個(gè)通知,告訴它配置已經(jīng)變了,需要重新刷新界面。類(lèi)似的操作就像是橫豎屏切換,在onConfigurationChanged()方法里面進(jìn)行需要的操作的配置。

橫豎屏切換,app走的生命周期方法是onDestroy(),onCreate()。一般我們的應(yīng)用通常配置是設(shè)定一個(gè)固定的方向讓它避免橫豎屏切換。通過(guò)配置configChanges屬性,防止界面的銷(xiāo)毀和重建。

android:screenOrientation="portrait" android:configChanges="orientation|screenSize|keyboardHidden

回到問(wèn)題本身,發(fā)生問(wèn)題的原理是這樣的:系統(tǒng)字體大小發(fā)生了變化,它在app回到前臺(tái)的時(shí)候發(fā)送了一個(gè)通知告訴app。app此時(shí)走的生命周期的方法是

onDestroy()onCreate()onResume()

通過(guò)這樣的操作進(jìn)行UI界面的刷新。

重點(diǎn)來(lái)了:此時(shí)app是作為一種異常走的onDestroy()方法,并不是正常的按返回鍵進(jìn)行的退出執(zhí)行的onDestroy()。這個(gè)時(shí)候系統(tǒng)會(huì)自動(dòng)在onSaveInstanceState()方法里面臨時(shí)性的保存之前的界面狀態(tài)或者變量信息。方便在onCreate()的時(shí)候,從bundle里面直接取出來(lái)使用。但是畢竟是異常的狀態(tài),有些實(shí)體的信息或者fragment堆棧的狀態(tài)恢復(fù)的時(shí)候就有可能錯(cuò)亂,導(dǎo)致顯示效果出錯(cuò)或者crash。

二.解決方法

android:configChanges="orientation|screenSize|keyboardHidden|**fontScale**

1.添加fontScale屬性,避免系統(tǒng)字體發(fā)生變化的時(shí)候,重新create界面。如果僅僅這樣處理,app的在從后臺(tái)切換到前臺(tái)的時(shí)候,字體會(huì)隨著系統(tǒng)的字體大小發(fā)生變化。

2.把a(bǔ)pp里面字體的單位,由sp改為dp,這樣,app的字體展示就不會(huì)隨著系統(tǒng)的字體變化而發(fā)生變化。

可以根據(jù)產(chǎn)品的需要自行進(jìn)行配置。

三.引申思考

解決完上面的問(wèn)題了,有善于思考的同學(xué)就問(wèn)了,這個(gè)是解決切換系統(tǒng)的字體大小產(chǎn)生的問(wèn)題,如果我切換系統(tǒng)字體的樣式呢?出現(xiàn)問(wèn)題又該怎么解決?

其實(shí)有了上面的基礎(chǔ),解決這個(gè)問(wèn)題就容易的多了。

在切換字體大小的時(shí)候,我們知道系統(tǒng)會(huì)發(fā)送通知,我們?cè)O(shè)置fontScale屬性就可以了。但是切換字體的樣式,系統(tǒng)并沒(méi)有通知,谷歌官方也沒(méi)有,stack上也是各種提問(wèn),沒(méi)有找到監(jiān)聽(tīng)的事件或者方法。

切換樣式之后,我們可以觀察一下Activity的生命周期,依然是onDestroy(),onCreate()….因?yàn)槭钱惓5膁estroy,系統(tǒng)會(huì)把當(dāng)前的狀態(tài)信息存入saveInstanceState()方法里面的bundle,onCreate()的時(shí)候,從bundle里面取出來(lái)進(jìn)行恢復(fù)。有時(shí)候,保存的bundle狀態(tài)不對(duì),導(dǎo)致界面加載錯(cuò)亂。

解決的方法:
在onCreate()的時(shí)候,判斷bundle里面是否有數(shù)據(jù),如果有數(shù)據(jù),進(jìn)行賦空處理,然后走一遍正常的流程,就可以了。具體代碼如下:

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

這個(gè)配置可以放在項(xiàng)目的BaseActivity里面,可以減少對(duì)現(xiàn)有代碼的改動(dòng)。

思考:其實(shí)這個(gè)時(shí)候,你會(huì)發(fā)現(xiàn),在切換字體大小的時(shí)候,也可以這樣配置,甚至這樣配置之后就不用管fontScale之類(lèi)的屬性了,讓界面自己刷新去吧,反正第二次的onCreate()跟重新進(jìn)入app效果是一樣的。

四.小結(jié)

博主最近才開(kāi)始寫(xiě)博客,記錄一些工作中遇到的坑,分享出來(lái)讓做開(kāi)發(fā)的小伙伴們能快速的繞過(guò)這些坑,提高效率。如果文章有不對(duì)的地方,請(qǐng)幫忙指正出來(lái),謝謝。

當(dāng)時(shí)查閱的資料網(wǎng)址也感謝其他博主的無(wú)私分享:
http://blog.csdn.net/murphykwu/article/details/24774015
http://blog.csdn.net/zhuqiang1002/article/details/38756127

如果覺(jué)得有幫助,可以加我好友,拉你進(jìn)去技術(shù)討論群,共同進(jìn)步

總結(jié)

以上是生活随笔為你收集整理的关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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