TabView,快速實(shí)現(xiàn)Android底部導(dǎo)航欄

前言

主流的安卓APP,首頁經(jīng)常會(huì)采用底部導(dǎo)航欄切換的效果矿辽。針對這種情況,封裝成TabView工具類郭厌,方便大家使用袋倔。


一、界面分析

  • 上圖的效果折柠,我們可以判斷出界面是由viewpager+fragment+底部Tab實(shí)現(xiàn)宾娜。

二、開始擼碼

只貼出了核心代碼扇售,具體請查看我的GitHub,記得點(diǎn)顆?哦!

1. 實(shí)現(xiàn)底部的Tab,自定義TabContainerView 繼承 RelativeLayout前塔,這是我們最終封裝的View工具類。其內(nèi)部主要由viewpager和底部的TabHost類組成承冰。

ViewPager初始化

 contentViewPager = new ViewPager(context);
        LayoutParams contentVpLp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        contentVpLp.addRule(RelativeLayout.ABOVE, R.id.divide_tab);
        contentViewPager.setLayoutParams(contentVpLp);
        contentViewPager.setId(R.id.viewpager_tab);

        contentViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                tabHost.onChangeTabHostStatus(position);
                Tab selectedTab = tabHost.getTabForIndex(position);
                if (onTabSelectedListener != null && selectedTab != null) onTabSelectedListener.onTabSelected(selectedTab);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

        addView(contentViewPager);

底部Tab是一個(gè)自定義的橫向布局LinearLayout,動(dòng)態(tài)添加多個(gè)寬度等分的Tab按鈕

 for (int i = 0; i < count; i++) {
            if((i+1)==hasMsgIndex){
                hasMsg=true;
            }
            Tab tab = new Tab(context, textArray[i], textSize, textColor, selectedTextColor,drawablePadding,iconWidth,iconHeight, iconImageArray[i], selectedIconImageArray[i], i,hasMsg);
            addTab(tab);
        }

tab按鈕的實(shí)現(xiàn)

 rootView = new LinearLayout(context);
        childView=new RelativeLayout(context);
        LinearLayout.LayoutParams rootViewLp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        rootViewLp.weight = 1;
        rootView.setOrientation(LinearLayout.VERTICAL);
        rootView.setPadding(0,20,0,20);
        rootView.setLayoutParams(rootViewLp);
        textTextView = new TextView(context);
        iconImageView = new ImageView(context);

        /**
         *  icon view
         */
        iconImageView.setImageResource(iconImage);
        RelativeLayout.LayoutParams iconParam=new RelativeLayout.LayoutParams(iconWidth==0? ViewGroup.LayoutParams.WRAP_CONTENT:iconWidth,iconHeight==0? ViewGroup.LayoutParams.WRAP_CONTENT:iconHeight);
        iconParam.addRule(RelativeLayout.CENTER_HORIZONTAL);
        iconImageView.setLayoutParams(iconParam);
        iconImageView.setId(index+1);
        childView.addView(iconImageView);

        /**
         *  text view
         */
        textTextView.setText(text);
        textTextView.setTextColor(textColor);
        textTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize);
        textTextView.setPadding(0,drawablePadding,0,0);
        RelativeLayout.LayoutParams txParam=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        txParam.addRule(RelativeLayout.BELOW,childView.getChildAt(0).getId());
        txParam.addRule(RelativeLayout.CENTER_HORIZONTAL);
        textTextView.setLayoutParams(txParam);
        childView.addView(textTextView);


        if(hasMsg){
            ImageView circleView=new ImageView(context);
            RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(30,30);
            param.addRule(RelativeLayout.RIGHT_OF,iconImageView.getId());
            circleView.setBackgroundResource(R.drawable.common_red_round);
            circleView.setLayoutParams(param);
            childView.addView(circleView);
        }
        RelativeLayout.LayoutParams childParam=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        childView.setLayoutParams(childParam);
       rootView.addView(childView);

三华弓、使用方法

  • 布局中引用
<com.chenxi.tabview.widget.TabContainerView
        android:id="@+id/tab_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:tabTextColor="@color/bottom_icon_up"
        app:selectedTextColor="@color/common_red"
        app:tabTextSize="12sp"
        app:drawablePadding="1dp"
        app:iconHeight="22dp"
        app:iconWidth="22dp"
        app:divideLineColor="@color/common_line_two"
        app:divideLineHeight="0.3dp"/>
  • ACTIVITY中引用
 TabContainerView tabContainerView = (TabContainerView) findViewById(R.id.tab_container);
        MainViewAdapter mainViewAdapter=new MainViewAdapter(getSupportFragmentManager(),
                new Fragment[] {new TabFragment1(), new TabFragment2(),new TabFragment3(), new TabFragment4(),new TabFragment5()});
        mainViewAdapter.setHasMsgIndex(5);
        tabContainerView.setAdapter(mainViewAdapter);
        tabContainerView.setOnTabSelectedListener(new OnTabSelectedListener() {
            @Override
            public void onTabSelected(Tab tab) {

            }
        });
  • 布局自定義屬性介紹
tabTextSize:導(dǎo)航按鈕字體大小
drawablePadding:導(dǎo)航圖片與文字的間距
iconHeight: 導(dǎo)航圖標(biāo)高度
iconWidth:導(dǎo)航圖標(biāo)寬度
divideLineColor:導(dǎo)航欄頂部分割線顏色
divideLineHeight:導(dǎo)航欄頂部分割線高度
  • 設(shè)置消息提醒(導(dǎo)航按鈕旁邊的紅點(diǎn)
setHasMsgIndex(5); //第五個(gè)導(dǎo)航按鈕有消息提醒
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巷懈,隨后出現(xiàn)的幾起案子该抒,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凑保,死亡現(xiàn)場離奇詭異冈爹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)欧引,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門频伤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芝此,你說我怎么就攤上這事憋肖。” “怎么了婚苹?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵岸更,是天一觀的道長。 經(jīng)常有香客問我膊升,道長怎炊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任廓译,我火速辦了婚禮评肆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘非区。我一直安慰自己瓜挽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布征绸。 她就那樣靜靜地躺著久橙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歹垫。 梳的紋絲不亂的頭發(fā)上剥汤,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天颠放,我揣著相機(jī)與錄音排惨,去河邊找鬼。 笑死碰凶,一個(gè)胖子當(dāng)著我的面吹牛暮芭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播欲低,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼辕宏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砾莱?” 一聲冷哼從身側(cè)響起瑞筐,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腊瑟,沒想到半個(gè)月后聚假,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體块蚌,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年膘格,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了峭范。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瘪贱,死狀恐怖纱控,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菜秦,我是刑警寧澤甜害,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站球昨,受9級特大地震影響唾那,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜褪尝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一闹获、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧河哑,春花似錦避诽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佳吞,卻和暖如春拱雏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背底扳。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工铸抑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衷模。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓鹊汛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阱冶。 傳聞我的和親對象是個(gè)殘疾皇子刁憋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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