Fragment:相信各位Android開發(fā)者不陌生了,且在這里我也不打算講,此文章的目的很明確,就是對Fragment進(jìn)行表面解剖<font color='red'><為什么說表面了?因?yàn)槲覀儾粫馄仕脑创a實(shí)現(xiàn),而只是了解它是何物?></font>
這里要說明下,此文章理論與解釋居多
為什么會有生命周期
此處肯定會有人問?為什么不能有生命周期。如果你這么問了,說明你并不知道Fragment面紗后面是什么,因?yàn)槟愀緵]回答我的問題。我們試想下,一個(gè)應(yīng)用的生命周期誰最清楚,毫無疑問,應(yīng)用本身,而Fragment我們都知道需要Activity才能正常工作,那么Activity做為四大組件之一,它又為什么會有生命周期了?<是不是在想,你腦子有問題吧,Activity從我開始學(xué)安卓起,各種教程都會說到Activity的生命周期>
那么問題來了,有以下幾個(gè)問題
- Activity是天生就有生命周期嗎?
- Fragment的生命周期是哪來的?
Activity生命周期的由來
上面我們說過了,應(yīng)用的生命周期只有應(yīng)用本身才知道,而Activity既然是四大組件之一,那么它只是應(yīng)用的一部分而已,也就是說Activity的生命周期只是應(yīng)用的生命周期中的一部分而已,我們都知道,Activity的生命周期的方法都是onXXX的格式,而我們都知道,一個(gè)方法名當(dāng)以on開始時(shí),這個(gè)方法肯定是在某個(gè)時(shí)間點(diǎn)會被回調(diào),很顯然,入口肯定是應(yīng)用本身回調(diào)了Activity中的某個(gè)方法,舉個(gè)栗子:教主與護(hù)法,教主有什么事情要做,只有他自己知道,那么護(hù)法什么時(shí)候會知道了?只有當(dāng)教主指派任務(wù)給護(hù)法的時(shí)候,護(hù)法才知道,哦,原來教主要做這件事,而其它事情,可能會安排給其它護(hù)法,這就好比四大護(hù)法對應(yīng)安卓中的四大組件,各有各的任務(wù)
總結(jié):Activity的創(chuàng)建是由Application類回調(diào),這里在一次驗(yàn)證了萬物皆為對象,都是來自于生活
說說Fragment的生命周期
前面我們講到,F(xiàn)ragment需要依賴Activity才能正常工作,那么它的生命周期與Activity的生命周期密切相關(guān),這相信大家已經(jīng)在實(shí)戰(zhàn)中發(fā)現(xiàn)了。我們了解了Activity的生命周期的由來,可能你們已經(jīng)想到了Fragment為什么會有生命周期了,對Activity與Fragment來說,Activity好比人的大腦,F(xiàn)ragment好比人的某個(gè)部位,簡單來說,F(xiàn)ragment的生命周期其實(shí)都是Activity回調(diào)管理的。
解剖Fragment
Fragment方法之onCreateView
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,Bundle savedInstanceState);
上面的方法,我們返回的View對象給誰了?第二個(gè)參數(shù)container又是何方神圣?
如果我說返回的View就給了第二個(gè)參數(shù)container你們信嗎?那么我們驗(yàn)證一下,大家也可以按照我的代碼自己驗(yàn)證。
很簡單,就是一個(gè)HelloWord工程,然后給MainActivity添加一個(gè)Fragment
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(android.R.id.content,new HelloWordFragment(), HelloWordFragment.TAG);
ft.commit();
}
}
public class HelloWordFragment extends Fragment {
public static final String TAG = "HelloWordFragment";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setText("我是Fragment中的TextView");
return textView;
}
}
以Debug斷點(diǎn)模式運(yùn)行后結(jié)果,如下圖:

和我們在add fragment的時(shí)候傳入的id是同一個(gè)值,而我們傳入的id其實(shí)就是Activity的內(nèi)容布局,所以最后運(yùn)行效果如下圖:

Fragment中的View與Activity本身的View重疊了,這是因?yàn)?code>android.R.id.content所對應(yīng)的View是FrameLayout。
到目前為止,我也只是驗(yàn)證了
container就是我們在添加Fragment的時(shí)候傳入的containerViewId而已,最后我們驗(yàn)證下containerViewId有幾個(gè)childView,看圖:
相信此圖說明了一切,也驗(yàn)證了我說的是對的
下面我們在驗(yàn)證另一種情況,將containerViewId設(shè)置成Activity布局中某個(gè)ViewGroup的的id,代碼如下:

將原本
RelativeLayout改為了LinearLayout,添加了一個(gè)FrameLayout,設(shè)置id為fragment_content;下面我們看Activity代碼,F(xiàn)ragment代碼不變:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
//將containerViewId改為布局中FrameLayout的ID
ft.add(R.id.fragment_content,new HelloWordFragment(), HelloWordFragment.TAG);
ft.commit();
}

結(jié)果很明顯,和我們上面的解釋一致
Fragment的作用
其實(shí)我們看完上面的解釋后,相信大家已經(jīng)大致了解了Fragment的作用,其實(shí)就是一個(gè)幫Activity管理某些View,就好比Activity是老板,F(xiàn)ragment是秘書,這就是Fragment的真面目,突然發(fā)現(xiàn)是不是其實(shí)也沒多神秘吧!像這種幫Activity管理View的功能,相信大家都可以寫個(gè)類完成,而Google這么做的目的只是幫助我們開發(fā)者,可以更好的開發(fā)功能,而并非花心思在這個(gè)上面。
PS:以上均為個(gè)人理解,如您發(fā)現(xiàn)有不對或疑問的地方,請留言提出,感謝。