之前開(kāi)發(fā)項(xiàng)目的時(shí)候朗恳,ViewPager嵌套Fragment的時(shí)候第二次切換回已經(jīng)打開(kāi)過(guò)Fragment的時(shí)候,此時(shí)Fragemnt顯示為空白苗沧,當(dāng)時(shí)遇到這個(gè)問(wèn)題的時(shí)候愉舔,真是一頭霧水,那會(huì)因?yàn)橼s項(xiàng)目察郁,就沒(méi)去分析這個(gè)問(wèn)題的產(chǎn)生原因衍慎,當(dāng)時(shí)解決的時(shí)候在Activity中調(diào)用viewPager.setOffscreenPageLimit(N)此方法去解決,此方法代表viewPager切換的時(shí)候會(huì)重新創(chuàng)建當(dāng)前界面左右的N個(gè)界面皮钠;
問(wèn)題產(chǎn)生原因:就是onCreateView每次都調(diào)用導(dǎo)致的稳捆,這樣每次打開(kāi)fragment每次都會(huì)設(shè)置新的view,而調(diào)試發(fā)現(xiàn)麦轰,之前的view并沒(méi)有被回收……這就導(dǎo)致了新的Fragment覆蓋了我們之前的Fragment乔夯,這時(shí)候就出現(xiàn)了Fragemnt空白的現(xiàn)象。
解決方式:
1 viewpager.setOffscreenPageLimit(num);num為你的tab數(shù)款侵,就是我使用的哪種方式
2 在Fragment中onCreateView里面末荐,判斷Fragment是否已經(jīng)添加了contentView(第一次加載時(shí),可以將view保存下 來(lái)新锈,再 次加載時(shí)甲脏,判斷保存下來(lái)的view是否為null),如果保存的view為null壕鹉,返回新的view 剃幌,否則,先將 保存的view從父view中移除晾浴,然后將該view返回出去
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//判斷該存不存在
if(view != null){
ViewGroup parent = (ViewGroup) view.getParent();
if(parent != null){
//存在就將其刪除
parent.removeView(view);
}
}
view = View.inflate(getActivity(), R.layout.layout_one, null);
tab_main = (TabLayout) view.findViewById(R.id.tab_main);
return view;
}
3 在ViewPager的Adapter中重寫(xiě)public void destroyItem(ViewGroup container, int position, Object object)负乡,去掉super.destroyItem(container, position, object);
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//方法體中什么也不用寫(xiě)
}
4
以上就是我對(duì)該ViewPager+Fragemnt遇到的問(wèn)題已經(jīng)總結(jié),有不對(duì)的地方脊凰,望各位多多指點(diǎn)抖棘,共同學(xué)習(xí)茂腥。