ViewPager+BottomNavigationView+Fragment實現(xiàn)底部導(dǎo)航欄

1.ViewPager

ViewPager例衍。它是google SDk中自帶的一個附加包的一個類俺附,可以用來實現(xiàn)屏幕間的切換。其與BottomNavigationView和Fragment配合使用可以很好的實現(xiàn)Android底部導(dǎo)航欄及屏幕滑動切換碎片的功能
首先在活動布局里加入ViewPager控件:用法同普通控件一樣

  <android.support.v4.view.ViewPager
        android:id="@+id/mViewPager"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="wrap_content"></android.support.v4.view.ViewPager>

接著在MainActivity中使用

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;//

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager=(ViewPager) findViewById(R.id.mViewPager);//獲取到ViewPager


        //ViewPager的監(jiān)聽
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                bottomNavigationView.getMenu().getItem(position).setChecked(true);
               //滑動頁面后做的事铃彰,這里與BottomNavigationView結(jié)合蜗巧,使其與正確page對應(yīng)
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        //底部導(dǎo)航欄有幾項就有幾個Fragment
        final ArrayList<Fragment> fgLists=new ArrayList<>(3);
        fgLists.add(new ManageFragment());
        fgLists.add(new FindFragment());
        fgLists.add(new MyFragment());


      //設(shè)置適配器用于裝載Fragment
        FragmentPagerAdapter mPagerAdapter=new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return fgLists.get(position);  //得到Fragment
            }

            @Override
            public int getCount() {
                return fgLists.size();  //得到數(shù)量
            }
        };
        mViewPager.setAdapter(mPagerAdapter);   //設(shè)置適配器
        mViewPager.setOffscreenPageLimit(2); //預(yù)加載剩下兩頁

        //以上就將Fragment裝入了ViewPager
  }

}

2.BottomNavigationView

在 build.gradle 文件中增加依賴:

  compile 'com.android.support:design:25.2.0'
  • 菜單元素只能是 3~5 個。如果個數(shù)少于3個或者多于5個奏赘,則會報錯寥闪。

在同樣的活動布局里加入BottomNavigationView控件,為了美觀磨淌,可以在ViewPager和BottomNavigationView中間加個View

<View
        android:layout_width="match_parent"
        android:background="#3399cc"   
        android:layout_height="1dp" />

<android.support.design.widget.BottomNavigationView
        android:id="@+id/mBottom"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:menu="@menu/navigation"></android.support.design.widget.BottomNavigationView>

其中有一項 app:menu="@menu/navigation" 用于底部導(dǎo)航欄的具體顯示
需要我們建一個menu的xml文件
我們在res/menu下新建一個navigation.xml(沒有menu文件夾就新建一個)疲憋,然后在xml里添加自己想要的目錄選項

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:title="管理"     //名字
        android:icon="@drawable/ic_manage"   //顯示的圖標(biāo)
        android:id="@+id/manager_item"/>

    <item
        android:id="@+id/find_item"
        android:icon="@drawable/ic_find"
        android:title="發(fā)現(xiàn)" />

    <item
        android:icon="@drawable/ic_my"
        android:id="@+id/my_item"
        android:title="我的" />

</menu>

圖中底部導(dǎo)航欄上的藍色條即為剛才加的View


bottom.JPG

在MainActivity中使用

public class MainActivity extends AppCompatActivity {
    private ViewPager mViewPager;
    private BottomNavigationView bottomNavigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager=(ViewPager) findViewById(R.id.mViewPager);
        bottomNavigationView=(BottomNavigationView) findViewById(R.id.mBottom);

      //設(shè)置點擊監(jiān)聽
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId())
                {
                    //根據(jù)navagatin.xml中item的id進行case
                    case R.id.manager_item:
                        mViewPager.setCurrentItem(0);
                      //跳到對應(yīng)ViewPager的page
                        break;
                    case R.id.find_item:
                        mViewPager.setCurrentItem(1);
                     
                        break;
                    case R.id.my_item:
                        mViewPager.setCurrentItem(2);
                     
                        break;
                }
                return false;
            }
        });

      //ViewPager的一系列設(shè)置
      .................
      ...................  
  }
}
            

以上ViewPager和BottomNavigationView的結(jié)合就使用完成

3.Fragment

碎片(fragment)里面就是我們具體要呈現(xiàn)給大家的東西,fragment的用法需要一個類和一個布局文件梁只,我們新建一個類繼承自Fragment

public class MyFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //R.layout.fragment_my為該fragment的布局
        View view=inflater.inflate(R.layout.fragment_my,container,false);
        return view;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

為該fragment新建一個布局文件,該布局很簡單缚柳,就加入了一個TextView,可以自行拓展加入各種控件等

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="my"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

剩余兩個fragment同上一樣

結(jié)尾

以上三者結(jié)合即可實現(xiàn)基本的底部導(dǎo)航欄UI布局設(shè)計

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搪锣,一起剝皮案震驚了整個濱河市秋忙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌构舟,老刑警劉巖灰追,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡弹澎,警方通過查閱死者的電腦和手機朴下,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苦蒿,“玉大人殴胧,你說我怎么就攤上這事∨宄伲” “怎么了溃肪?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長音五。 經(jīng)常有香客問我,道長羔沙,這世上最難降的妖魔是什么躺涝? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮扼雏,結(jié)果婚禮上坚嗜,老公的妹妹穿的比我還像新娘。我一直安慰自己诗充,他們只是感情好苍蔬,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝴蜓,像睡著了一般碟绑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茎匠,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音,去河邊找鬼联四。 笑死境蜕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汽馋。 我是一名探鬼主播侮东,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豹芯!你這毒婦竟也來了悄雅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤告组,失蹤者是張志新(化名)和其女友劉穎煤伟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡便锨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年围辙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片放案。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡姚建,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吱殉,到底是詐尸還是另有隱情掸冤,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布友雳,位于F島的核電站稿湿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏押赊。R本人自食惡果不足惜饺藤,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望流礁。 院中可真熱鬧涕俗,春花似錦、人聲如沸神帅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽找御。三九已至元镀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霎桅,已是汗流浹背凹联。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哆档,地道東北人蔽挠。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像瓜浸,于是被迫代替她去往敵國和親澳淑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

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