項目雜談–之即時通訊(底部Fragment)
最近做一個即時通訊的項目,如果你對這個項目名稱不是很瞭解,那麼打開你的手機qq,底部導航欄,有消息,聯繫人,動態這個三個按鈕,那麼依次的對應着三個fragment,當點擊了某一個按鈕,那麼去加載一個fragment,首先我們可以聲明三個fragment,依次叫做ContactFragment ,ConversationFragment, PluginFragment.
那麼問題來了,如何去創建三個fragment,我們都知道fragment是放在一個容器中,並且是由我們的fragmentManager進行管理的,添加fragment的方式有兩種
添加fragment的方式:
(1).replace 添加:
好比就是一個坑,等着我們創建好的fragment進行來填,
這種方式,我認爲不是很好,這種方式添加會對fragment的生命週期有影響。當點擊切換fragment的時候,原先創建好的fragment會被替換,重新去創建,這樣就不是很好了,如果說我們切換到聯繫人這個fragment的時候,上一次還有數據的,下一次去點擊的時候,還需要去重新加載數據,這樣就不是很好了。
(2).add方式添加 :
這種方式,對於我們這個項目是比較不錯的選擇,怎麼說呢,當我切換到另外一個fragment的時候,可以將其他的fragment隱藏起來,當被選中的fragment,讓其顯示處理,顯示不會走Fragment的onResume 方法,隱藏不會走Fragment的onPause方法,因此不會對Fragment的生命週期有影響
2.Fragment的創建。
這個Fragment的創建直接是通過工廠類來實現的,大體思路如下:
讓三個Fragment去繼承一個基類BaseFragment,創建一個工廠FragmentFactory,在這個工廠中,我使用了單例設計,將三個Fragment全部聲明稱靜態的成員變量,這樣做的好處,就是保證了在整個應用中只有對應Fragment的實例對象,
public class FragmentFactory {
private static ContactFragment mContactFragment;
private static ConversationFragment mConversationFragment;
private static PluginFragment mPluginFragment;
public static BaseFragment createFragment(int position) {
BaseFragment baseFragment = null;
switch (position) {
case 0:
if (mContactFragment == null) {
synchronized (FragmentFactory.class) {
if (mContactFragment == null) {
baseFragment = new ContactFragment();
}
}
}
break;
case 1:
if (mConversationFragment == null) {
synchronized (FragmentFactory.class) {
if (mConversationFragment == null) {
baseFragment = new ConversationFragment();
}
}
}
break;
case 2:
if (mPluginFragment == null) {
synchronized (FragmentFactory.class) {
if (mPluginFragment == null) {
baseFragment = new PluginFragment();
}
}
}
break;
}
return baseFragment;
}