簡介
????????在之前的項目中使用了自定義Snackbar,今天在新項目中使用就出現(xiàn)點擊崩潰的問題吉捶。查看日志報錯堆棧信息芥颈。發(fā)現(xiàn)java.lang.ClassCastException(類轉(zhuǎn)換異常)赎败,怎么會出現(xiàn)這個錯誤呢?
查找原因
錯誤:LinearLayout cannot be cast to SnackbarContentLayout尽爆。
意思:LinearLayout 不能轉(zhuǎn)換為SnackbarContentLayout怎顾。
(1)根據(jù)打印出的at android.support.design.widget.Snackbar.setText(Snackbar.java:208)日志進行定位具體出錯位置:
定位具體出錯位置
(2)通過查看SnackbarContentLayout源代碼,發(fā)現(xiàn)SnackbarContentLayout是LinearLayout的子類(如下圖SnackbarContentLayout繼承圖)漱贱,然后這怎么就會轉(zhuǎn)換錯誤了呢槐雾?
(3)仔細回想一下,自定義布局里添加了圖片幅狮,并且使用的是LinearLayout(如下圖:自定義Snackbar子view布局)募强,難道這里要換成SnackbarContentLayout?更換以后也是不行崇摄,看來這不是具體出現(xiàn)的問題擎值。再分析一下
(4)在上一個項目中使用毫無問題,怎么在這個項目中就出現(xiàn)問題了呢逐抑?對比兩個項目鸠儿,發(fā)現(xiàn)項目使用的android.support.design庫版本號不一樣,并且在新版本的代碼中有變化(如下圖:design庫的23和26版本代碼對比):
繼續(xù)分析錯誤堆棧測試發(fā)現(xiàn):在“我的”界面中點擊“下一步”,再點擊“首頁”居然就彈出了提示信息“測試操作成功”进每。實際上這個提示信息是應(yīng)該在“我的”界面才會顯示的汹粤。
最后發(fā)現(xiàn)封裝的BaseUIActivity和BaseUIFragment基類出現(xiàn)的問題
(1)查看項目代碼發(fā)現(xiàn)BaseUIFragment使用的顯示提示信息的方法showBottomNotify是用的BaseUIActivity中的
(2)導(dǎo)致類轉(zhuǎn)換異常是因為代碼中的targetView使用的BaseUIFragment中的CoordinatorLayout。由于在Activity和Fragment中進行布局使用的資源ID都是一樣的田晚,所以查找資源的方法使用的是同一個資源ID:root_parent_coordinator_layout(如下圖:通用資源Id引起的錯誤)
public?CoordinatorLayout?getRootParentCoordinatorLayout()?{
????????????if?(mRootParentCoordinatorLayout?==?null)?{
????????????????????mRootParentCoordinatorLayout?=?findViewById(R.id.root_parent_coordinator_layout);
????????????}
????????????return?mRootParentCoordinatorLayout;
}
最終解決方案
????????1.BaseUIFragment中使用獨立的showBottomNotify方法嘱兼;
? ? ? ?2.所有繼承自BaseUIFragment的Fragment布局文件的資源ID改為“root_fragment_parent_coordinator_layout”,同時將BaseUIFragment中的getRootParentCoordinatorLayout()方法中的資源ID修改成上面定義的ID贤徒,其實只要和繼承BaseUIActivity中的資源ID不一樣即可芹壕。
?
總結(jié):
? ?1.為了便于維護和修改(其實都是為了偷懶,哈哈哈接奈,這個接口就是這么毫無破綻……)踢涌,使用通用的資源ID對界面進行布局。
?????2.但是在使用Activity和Fragment結(jié)合的地方要慎重鲫趁,很容易導(dǎo)致View資源ID查找沖突到只問題斯嚎。好了,就和大家分享這么多了挨厚。
?????哈哈,喜歡就關(guān)注點個贊吧糠惫。
?????更多內(nèi)容持續(xù)更新疫剃,學(xué)習(xí)中,歡迎一起討論學(xué)習(xí)硼讽。