問題闡述 :
主界面有四個Fragment 分別爲A、B、C、D 這些爲第一層Fragment(創建方式是由事務提交形式),其中B Fragment中佈局爲ViewPager,裏面是放的三個Fragment 分別爲B_1、B_2、B_3,這些稱爲第二層Fragment
那麼在切換第一層Fragment時候,怎樣使第二層Fragment調用其生命週期? 並且使得第一層Fragment能夠緩存View?
我們首先來看 Fragment週期圖:
由圖可以知道 Fragment生命週期觸發方式是有兩種方式:即通過事務提交方式,還有一種是通過inflate 方式,由此我們知道案例中的第二層Fragment創建方式是inflate方式,所以要想第一層B的Fragment中能調用第二層的Fragment生命週期,就需要在B中調用
getChildFragmentManager
,而不能使用getFragmentManager()
,另一方面雖然此時可以實現B對第二層Fragment生命週期的調用,但是並不能實現對第一層Fragment的緩存處理即對 mViewRoot的複用,想要複用就需要額外處理,見下面代碼:
如果一個Fragment內部嵌套了Fragment,內部的Fragment切換的時候要能夠調用內部Fragment的生命週期:
1、內部切換要用getChildFragmentManager
2、外部的Fragment切換的時候,onCreateView調用的時候不能緩存View,需要每次inflater.inflate纔會走子Fragment的生命週期
那麼一般情況下切換第一次層的Fragment時候,B中Fragment是不會走生命週期的,那麼如何解決這個問題尼?
1 、在B Fragment中使用getChildFragmentManager
。
2、在B Fragment中使用如下代碼
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (!needReUseRootView() || mViewRoot == null) {
mViewRoot = inflater.inflate(R.layout.fragment_base, container, false);
}
}
protected boolean needReUseRootView() {
return false;
}
相應的在 第一層的其他Fragment中
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (!needReUseRootView() || mViewRoot == null) {
mViewRoot = inflater.inflate(R.layout.fragment_base, container, false);
}
}
protected boolean needReUseRootView() {
return true;
}