TabLayout 實(shí)現(xiàn)底部Tab

前言

底部Tab已經(jīng)是一個(gè)應(yīng)用的標(biāo)配了期揪,因?yàn)槭謾C(jī)屏幕大小的限制勾栗,使得我們必須去最大化的利用可見的空間苍苞。當(dāng)然底部Tab一般為3個(gè)左右,最多不會(huì)超過5個(gè)筒饰。

效果圖

下面是我使用TabLayout來實(shí)現(xiàn)的底部Tab缴啡,


實(shí)現(xiàn)方式也很簡(jiǎn)單,因?yàn)檫@里沒有“小滑塊”瓷们。只需要去處理业栅,Tab的滑動(dòng)和點(diǎn)擊即可。

代碼:

public class CustomBotTabItem {

    private TabLayout mTabLayout;
    private ViewPager mViewPager;
    private Context mContext;
    //底部Tab標(biāo)題
    private final String[] mTitles = {"主頁", "理財(cái)", "添加", "消息", "我的"};
    //返回CustomBotTabItem實(shí)例
    public static CustomBotTabItem create() {
        return TabItemHolder.sCustomTabItem;
    }
    //創(chuàng)建CustomBotTabItem實(shí)例
    private static class TabItemHolder {
        private static CustomBotTabItem sCustomTabItem = new CustomBotTabItem();
    }
    //引入布局需要的Context
    public CustomBotTabItem setContext(Context context) {
        mContext = context;
        return this;
    }
    //需要自定義的TabLayout
    public CustomBotTabItem setTabLayout(TabLayout tabLayout) {
        mTabLayout = tabLayout;
        return this;
    }
    //設(shè)置與TabLayout關(guān)聯(lián)的ViewPager
    public CustomBotTabItem setViewPager(ViewPager viewPager) {
        mViewPager = viewPager;
        return this;
    }
    //創(chuàng)建Tab
    public CustomBotTabItem build() {
        initTabLayout();
        return this;
    }
    //初始化Tab
    private void initTabLayout() {
        mTabLayout.setupWithViewPager(mViewPager);
        //第二個(gè)參數(shù)為selector谬晕,下同
        mTabLayout.getTabAt(0).setCustomView(getTabView(0, R.drawable.home_icon_selector));
        mTabLayout.getTabAt(1).setCustomView(getTabView(1, R.drawable.manage_icon_selector));
        mTabLayout.getTabAt(2).setCustomView(getTabView(2, R.drawable.add_icon_selector));
        mTabLayout.getTabAt(3).setCustomView(getTabView(3, R.drawable.find_icon_selector));
        mTabLayout.getTabAt(4).setCustomView(getTabView(4, R.drawable.money_icon_selector));
        tabSelectListener();
    }
     //自定義Tab樣式
    private View getTabView(final int position, int resId) {
        final View view = LayoutInflater.from(mContext).inflate(R.layout.bottom_tab_item, null);
        TextView tvTitle = (TextView) view.findViewById(R.id.id_tv_title);
        final ImageView ivTitle = (ImageView) view.findViewById(R.id.id_iv_title);
        ivTitle.setImageResource(resId);
        tvTitle.setText(mTitles[position]);
        //默認(rèn)第一個(gè)tab選中碘裕,設(shè)置字體為選中色
        if (position == 0) {
            tvTitle.setTextColor(Color.parseColor("#4192e3"));
        } else {
            tvTitle.setTextColor(Color.parseColor("#262a3b"));
        }
        //點(diǎn)擊Tab切換
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mViewPager.setCurrentItem(position);
            }
        });
        return view;
    }
    //Tab監(jiān)聽
    private void tabSelectListener() {
        mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                changeTabStatus(tab, true);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                changeTabStatus(tab, false);
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }
    //切換Tab文字是否選中的的顏色
    private void changeTabStatus(TabLayout.Tab tab, boolean selected) {
        View view = tab.getCustomView();
        if (view == null) {
            return;
        }
        TextView tvTitle = (TextView) view.findViewById(R.id.id_tv_title);
        if (selected) {
            tvTitle.setTextColor(Color.parseColor("#4192e3"));
        } else {
            tvTitle.setTextColor(Color.parseColor("#262a3b"));
        }
    }
}

Activity 代碼:

public class BottomTabLayoutActivity extends AppCompatActivity {

    private TabLayout mTabLayout;
    private ViewPager mViewPager;
    private List<Fragment> mFragmentList;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bot_tab_layout);
        findView();
        initFragmentList();
        setVpAdapter();
        CustomBotTabItem item = CustomBotTabItem.create();
        item.setContext(this)
                .setViewPager(mViewPager)
                .setTabLayout(mTabLayout)
                .build();
    }
    //findViewById
    private void findView() {
        mTabLayout = (TabLayout) findViewById(R.id.id_tab_layout);
        mViewPager = (ViewPager) findViewById(R.id.id_vp);
    }
    //初始化需要的Fragment
    private void initFragmentList() {
        mFragmentList = new ArrayList<>();
        mFragmentList.add(TabFragment.getInstance("主頁"));
        mFragmentList.add(TabFragment.getInstance("理財(cái)"));
        mFragmentList.add(TabFragment.getInstance("添加"));
        mFragmentList.add(TabFragment.getInstance("消息"));
        mFragmentList.add(TabFragment.getInstance("我的"));
    }
    //設(shè)置ViewPager的Adapter
    private void setVpAdapter() {
        mViewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), mFragmentList, this));
    }
}

Activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <android.support.design.widget.TabLayout
        android:id="@+id/id_tab_layout"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_alignParentBottom="true"
        android:background="#fff"
        android:fillViewport="false"
        app:layout_scrollFlags="scroll"
        app:tabIndicatorHeight="0dp"
        app:tabMode="fixed"
        >
    </android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/id_vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/id_tab_layout"
        />
</RelativeLayout>

好了,具體思路攒钳、代碼就這么多了帮孔,其它需要的文件都比較簡(jiǎn)單,自己添加一下吧不撑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末文兢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子焕檬,更是在濱河造成了極大的恐慌姆坚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件实愚,死亡現(xiàn)場(chǎng)離奇詭異兼呵,居然都是意外死亡兔辅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門萍程,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幢妄,“玉大人,你說我怎么就攤上這事茫负〗对В” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵忍法,是天一觀的道長(zhǎng)潮尝。 經(jīng)常有香客問我,道長(zhǎng)饿序,這世上最難降的妖魔是什么勉失? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮原探,結(jié)果婚禮上乱凿,老公的妹妹穿的比我還像新娘。我一直安慰自己咽弦,他們只是感情好徒蟆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著型型,像睡著了一般段审。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闹蒜,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天寺枉,我揣著相機(jī)與錄音,去河邊找鬼绷落。 笑死姥闪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘱函。 我是一名探鬼主播甘畅,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼往弓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蓄氧,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤函似,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后喉童,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撇寞,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔑担。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牌废。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啤握,靈堂內(nèi)的尸體忽然破棺而出鸟缕,到底是詐尸還是另有隱情,我是刑警寧澤排抬,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布懂从,位于F島的核電站,受9級(jí)特大地震影響蹲蒲,放射性物質(zhì)發(fā)生泄漏番甩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一届搁、第九天 我趴在偏房一處隱蔽的房頂上張望缘薛。 院中可真熱鬧,春花似錦卡睦、人聲如沸宴胧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牺汤。三九已至,卻和暖如春浩嫌,著一層夾襖步出監(jiān)牢的瞬間檐迟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工码耐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留追迟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓骚腥,卻偏偏與公主長(zhǎng)得像敦间,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子束铭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容