嵌套Tab在Android應(yīng)用中用途廣泛,之前做過(guò)的一些東西都是運(yùn)用了TabActivity。但是由于在Android Developers中說(shuō)到了“TabActivity was deprecated in API level 13." ,并且建議大家使用Fragment。所以學(xué)習(xí)了嵌套Fragment的使用,參考了這個(gè)博客中的相關(guān)思路和代碼。
創(chuàng)建一個(gè)自己的Fragment,需要?jiǎng)?chuàng)建一個(gè)Fragment的子類(lèi)。Fragment的生命周期和Activity的生命周期類(lèi)似,它包含了很多與Activity類(lèi)似的回調(diào)函數(shù)。
在第一次繪制UI的時(shí)候系統(tǒng)調(diào)用該方法,為了繪制UI,返回一個(gè)fragment布局的根View。
1.在layout文件中聲明fragment
2.將一個(gè)fragment添加到viewgroup中,使用FragmentTransaction添加、替換或者刪除fragment。
關(guān)于解決 java.lang.IllegalStateException The specified child already has a parent. You must call removeView()的方法
在運(yùn)行調(diào)試的時(shí)候會(huì)發(fā)現(xiàn),在第二次點(diǎn)擊一個(gè)相同的tab的時(shí)候,會(huì)出現(xiàn)上述異常。
這個(gè)異常說(shuō)的是,這個(gè)特定的child view已經(jīng)存在一個(gè)parent view了,必須讓parent view調(diào)用removeView()方法。
經(jīng)過(guò)對(duì)fragment的生命周期的分析
運(yùn)行順序:點(diǎn)擊tab1,點(diǎn)擊tab2,再點(diǎn)擊tab1.
具體fragment的生命周期是:
對(duì)上圖進(jìn)行分析,可以發(fā)現(xiàn),出問(wèn)題的是viewpager中的view。當(dāng)切換不同的viewpager(即fragment,每個(gè)fragment中裝載了一個(gè)viewpager)時(shí),調(diào)用了startActivity()方法的時(shí)候,傳入了相同的id,會(huì)返回相同的對(duì)象。而當(dāng)我們?cè)诘诙握{(diào)用的時(shí)候,傳入了相同的id是復(fù)用了原來(lái)的view,這就導(dǎo)致了view被指定多個(gè)parent view。
所以解決辦法就是,在使用這個(gè)view之前首先判斷其是否存在parent view,這調(diào)用getParent()方法可以實(shí)現(xiàn)。如果存在parent view,那么就調(diào)用removeAllViewsInLayout()方法。代碼如下:
TestFragmentActivity.java
聯(lián)系客服