仿QQ首頁底欄案例
實現(xiàn)效果圖
源碼地址:https://github.com/luojunquan/QQPractise.git
注意事項:
// 開啟一個Fragment事務(wù)
// FragmentTransaction transaction = fragmentManager.beginTransaction();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
在onCreate()方法中先是調(diào)用了initViews()來獲取每個控件的實例撬即,并給相應(yīng)的控件設(shè)置好點擊事件但壮,然后調(diào)用setTabSelection()方法設(shè)置默認的選中項次企,這里傳入的0說明默認選中第1個Tab項物邑。
那么setTabSelection()方法中又是如何處理的呢?可以看到茁裙,首先第一步是調(diào)用clearSelection()方法來清理掉之前的選中狀態(tài),然后開啟一個Fragment事務(wù),并隱藏掉所有的Fragment拆宛,以防止有多個Fragment顯示在界面上。接下來根據(jù)傳入的index參數(shù)判斷出選中的是哪一個Tab項熬甫,并改變該Tab項的圖標(biāo)和文字顏色胰挑,然后將相應(yīng)的Fragment添加到界面上。這里注意一個細節(jié)椿肩,我們添加Fragment的時候并沒有使用replace()方法瞻颂,而是會先判斷一下該Fragment是否為空,如果是空的則調(diào)用add()方法添加一個進來郑象,如果不是空的則直接調(diào)用show()方法顯示出來即可贡这。那么為什么沒有使用replace()方法呢?這是因為replace()方法會將被替換掉的那個Fragment徹底地移除掉厂榛,該Fragment的生命周期就結(jié)束了盖矫。當(dāng)再次點擊剛才那個Tab項的時候,就會讓該Fragment的生命周期重新開始击奶,onCreate()辈双、onCreateView()等方法都會重新執(zhí)行一遍。這顯然不是我們想要的柜砾,也和ActivityGroup的工作原理不符湃望,因此最好的解決方案就是使用hide()和show()方法來隱藏和顯示Fragment,這就不會讓Fragment的生命周期重走一遍了痰驱。
設(shè)置完默認選中項后证芭,我們當(dāng)然還可以通過點擊Tab項來自由地切換界面,這就會進入到onClick()方法中担映。onClick()方法中的邏輯判斷非常簡單废士,當(dāng)點擊了消息標(biāo)簽時就會選中第1個tab項,點擊聯(lián)系人標(biāo)簽時就會選中第2個tab項蝇完,點擊動態(tài)標(biāo)簽時就會選中第3個tab項官硝,點擊設(shè)置標(biāo)簽時就會選中第4個tab項。都是通過調(diào)用setTabSelection()方法來完成的短蜕,只是傳入了不同的參數(shù)氢架。
當(dāng)開啟一個事物時,必須用V4包里getSupportFragmentManager忿危,并且加載的fragment里的fragment也必須要用v4包里的达箍,
這里有一個小bug就是底欄的高度不能低于80dp,可能是圖標(biāo)的問題铺厨,當(dāng)?shù)陀?0dp時缎玫,漢字不顯示