BottomNavigationView結合ViewPager

来源:http://www.cnblogs.com/ganchuanpu/archive/2017/05/30/6920000.html
-Advertisement-
Play Games

BottomNavigationView是Google推出的底部導航欄組件,在沒有這些底部導航組件之前,Android開發者多使用的是RadioGroup,在上一個項目開發中我們使用了Google的BottomNaviationView與ViewPager相結合搭建了UI框架,現項目已經完成,總結如 ...


BottomNavigationView是Google推出的底部導航欄組件,在沒有這些底部導航組件之前,Android開發者多使用的是RadioGroup,在上一個項目開發中我們使用了Google的BottomNaviationView與ViewPager相結合搭建了UI框架,現項目已經完成,總結如下:

使用BottomNaviationView需要添加依賴庫:

在app moudle 裡面的build.gradle文件中,dependencies節點下麵添加如下依賴:

compile 'com.android.support:design:25.3.0'  

添加完依賴我們便可以在佈局文件中使用了,activity_main.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:app="http://schemas.android.com/apk/res-auto"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:id="@+id/activity_main"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    tools:context="com.qj.simpleuiframe.MainActivity">  
  
    <!--狀態欄-->  
    <View  
        android:layout_width="match_parent"  
        android:layout_height="24dp"  
        android:background="@color/color661BB5D7"/>  
  
    <!--標題欄-->  
    <TextView  
        android:id="@+id/title"  
        android:layout_width="match_parent"  
        android:layout_height="40dp"  
        android:background="@color/color1BB5D7"  
        android:gravity="center"  
        android:textColor="@color/colorFFFFFF"  
        android:textSize="20sp"/>  
  
    <android.support.v4.view.ViewPager  
        android:id="@+id/viewpager"  
        android:layout_width="match_parent"  
        android:layout_height="0dp"  
        android:layout_weight="1"/>  
  
    <!--底部導航欄-->  
    <android.support.design.widget.BottomNavigationView  
        android:id="@+id/bnv"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:background="?android:attr/windowBackground"  
        app:itemIconTint="@drawable/tab_text_color_selector"  
        app:itemTextColor="@drawable/tab_text_color_selector"  
        app:menu="@menu/navigation"/>  
</LinearLayout>  

先說說底部導航欄BottomNaviationView:
app:menu="@menu/navigation" 這句說明:在我們的res文件夾下麵有一個menu文件夾,menu文件夾裡面有一個navigation文件,裡面是關於我們底部導航欄的信息

我們來看看這個navigation.xml文件

<?xml version="1.0" encoding="utf-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android">  
  
    <item  
        android:id="@+id/tab_one"  
        android:icon="@drawable/tab_one_selector"  
        android:title="@string/tab_one"/>  
  
    <item  
        android:id="@+id/tab_two"  
        android:icon="@drawable/tab_two_selector"  
        android:title="@string/tab_two"/>  
  
    <item  
        android:id="@+id/tab_three"  
        android:icon="@drawable/tab_three_selector"  
        android:title="@string/tab_three"/>  
</menu> 

我們看到裡面總共有三個導航按鈕,我們以第一個為例做一下簡單的說明:
id和title屬性很簡單,我們看一下icon屬性,我們平時的底部導航按鈕都是上圖下文形式的(大多情況是這樣),下麵的文字是由我們的title屬性指定的,上面的圖片則是由我們這裡的icon屬性所決定的,我們看一看這個很簡單的tab_one_selector選擇器:

<?xml version="1.0" encoding="utf-8"?>  
<selector xmlns:android="http://schemas.android.com/apk/res/android">  
    <item android:drawable="@mipmap/commend_select" android:state_pressed="true"/>  
    <item android:drawable="@mipmap/commend_select" android:state_selected="true"/>  
    <item android:drawable="@mipmap/commend"/>  
</selector> 

到這app:menu="@menu/navigation"  就說完了
下麵說一下

app:itemIconTint="@drawable/tab_text_color_selector"
app:itemTextColor="@drawable/tab_text_color_selector"

app:itemIconTint是設置底部導航按鈕圖標顏色的屬性

app:itemTextColor是設置底部導航按鈕文字顏色的屬性

由於大多情況下圖標和文件顏色都是相同的(為了統一風格樣式),所以它們兩個我用的是同一個顏色選擇器

說到這BottomNaviationView這個控制項就說完了,下麵解釋一下activity_main.xml文件中的狀態欄控制項,在佈局中寫狀態欄的原因是因為我們的應用主題是沒有ActionBar並且狀態欄是透明的,所以狀態欄和標題欄需要我們自己來寫(也是為了滿足用戶定義不同樣式的狀態欄和標題欄的要求)

下麵看一下appTheme這一主題:

<!-- Base application theme. -->  
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">  
        <!-- 全屏、無標題欄、狀態欄透明 -->  
        <item name="colorPrimary">@color/colorPrimary</item>  
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>  
        <item name="colorAccent">@color/colorAccent</item>  
        <item name="android:windowTranslucentStatus">true</item>  
    </style>  

可以看到AppTheme的父主題是沒有ActionBar的,而且我們還設置了它的的windowTranslucentStatus為true,即狀態欄透明
這樣我們的Activity就完全全屏了,沒了狀態欄和標題欄,我們就可以自己定義狀態欄和標題欄了!
到這裡activity_main.xml文件就說完了,下麵看一下MainActivity.Java中的代碼

public class MainActivity extends FragmentActivity implements BottomNavigationView.OnNavigationItemSelectedListener, ViewPager.OnPageChangeListener {  
  
    private ViewPager mViewPager;  
    private BottomNavigationView mBottomNavigationView;  
    private TextView mTitle;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        initView();  
        initData();  
        initListener();  
    }  
  
    private void initView() {  
        mTitle = (TextView) findViewById(R.id.title);  
        mBottomNavigationView = (BottomNavigationView) findViewById(R.id.bnv);  
        mViewPager = (ViewPager) findViewById(R.id.viewpager);  
    }  
  
    private void initData() {  
    }  
  
    private void initListener() {  
        mBottomNavigationView.setOnNavigationItemSelectedListener(this);  
        //系統預設選中第一個,但是系統選中第一個不執行onNavigationItemSelected(MenuItem)方法,如果要求剛進入頁面就執行clickTabOne()方法,則手動調用選中第一個  
        mBottomNavigationView.setSelectedItemId(R.id.tab_one);//根據具體情況調用  
        mViewPager.addOnPageChangeListener(this);  
        //為viewpager設置adapter  
        mViewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));  
    }  
  
    @Override  
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {  
        //BottomNaviationView和ViewPager聯動,當BottomNaviationView的某個tab按鈕被選中了,同時設置ViewPager對應的頁面被選中  
        int itemId = item.getItemId();  
        switch (itemId) {  
            case R.id.tab_one:  
                clickTabOne();  
                return true;//返回true,否則tab按鈕不變色,未被選中  
            case R.id.tab_two:  
                clickTabTwo();  
                return true;  
            case R.id.tab_three:  
                clickTabThree();  
                return true;  
  
            default:  
                break;  
        }  
        return false;  
    }  
  
    @Override  
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {  
    }  
  
    @Override  
    public void onPageSelected(int position) {  
        //ViewPager和BottomNaviationView聯動,當ViewPager的某個頁面被選中了,同時設置BottomNaviationView對應的tab按鈕被選中  
        switch (position) {  
            case 0:  
                mBottomNavigationView.setSelectedItemId(R.id.tab_one);  
                break;  
            case 1:  
                mBottomNavigationView.setSelectedItemId(R.id.tab_two);  
                break;  
            case 2:  
                mBottomNavigationView.setSelectedItemId(R.id.tab_three);  
                break;  
  
            default:  
                break;  
        }  
    }  
  
    @Override  
    public void onPageScrollStateChanged(int state) {  
    }  
  
    private void clickTabOne() {  
        //為防止隔頁切換時,滑過中間頁面的問題,去除頁面切換緩慢滑動的動畫效果  
        mViewPager.setCurrentItem(0, false);  
        mTitle.setText("One");  
    }  
  
    private void clickTabTwo() {  
        mViewPager.setCurrentItem(1, false);  
        mTitle.setText("Two");  
    }  
  
    private void clickTabThree() {  
        mViewPager.setCurrentItem(2, false);  
        mTitle.setText("Three");  
    }  
}  

代碼中都有詳細的註釋,這裡就不多說了,這裡說一下ViewPager設置適配器,代碼中創建了ViewPagerAdapter對象

public class ViewPagerAdapter extends FragmentPagerAdapter {  
    //由於頁面已經固定,故這裡把Adapter需要的fragment提前創建  
    private Fragment[] mFragments = new Fragment[]{new OneFragment(), new TwoFragment(), new ThreeFragment()};  
  
    public ViewPagerAdapter(FragmentManager fm) {  
        super(fm);  
    }  
  
    @Override  
    public Fragment getItem(int position) {  
        return mFragments[position];  
    }  
  
    @Override  
    public int getCount() {  
        return 3;  
    }  
}  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.打開Vue腳手架的github地址:https://github.com/vuejs/vue-cli,在README查看如何安裝 2.通過npm安裝vue 3.通過webpack安裝 4.切換到創建的項目目錄,然後安裝依賴文件 ...
  • 這是為了防止文檔在完全載入(就緒)之前運行 jQuery 代碼。$(document).ready() 方法允許我們在文檔完全載入完後執行函數$(document).ready(function(){ // jQuery methods go here...}); 簡寫:$(function(){ ...
  • 1.驗證是否全為數字 2.驗證郵箱 3驗證手機號 4.驗證身份證號 5.驗證時間格式 下麵是代碼,可直接用,有註釋 運行結果如圖: 當驗證全部通過時,會通過post方式提交給後臺! ...
  • css重構之旅 >前言: 今年我大一,馬上就要大二了。從高三畢業暑假到大學的這一年馬上過去,馬上迎來大二生活.學習前端也有將近一年了。一昧去追求那些視覺的效果和相對高端和新穎的技術,反而忽略了最基礎的佈局技巧。 回味 2017年3月,百格教育的手機端網站,是我接到的第一個公司外包的項目。我和組長合作 ...
  • 一、組件的嵌套 在做移動端的時候,有時候我們可以把React與mui混合使用,但mui中的classname記得換成className,另外三大框架(vue/react/angular)都可以與bootstrap搭配使用, 在一些簡單的頁面中我們可以使用bootstrap的可視化組件快速搭建原型頁面 ...
  • 內容簡介 《HTML5與CSS3基礎教程(第8版)》自第1版至今,一直是講解HTML和CSS入門知識的經典暢銷書,全面系統地闡述HTML5和CSS3基礎知識以及實際運用技術,通過大量實例深入淺出地分析了網頁製作的方方面面。全新第8版不僅介紹了文本、圖像、鏈接、列表、表格、表單等網頁元素,還介紹瞭如何 ...
  • 拼圖,游戲是廣受歡迎的一種智力游戲,它的變化多端,難度不一,讓人百玩不厭。 個性化的拼圖,拼湊的不僅僅是一張照片,而是一個故事,一段回憶,一縷溫情。每一片的單片都有它自己的位置,就像每段回憶都有它的故事,你要將它放在專屬的地方,放對了就慢慢豐富起來,放錯了就無法完整。 你可以把你記憶中最深的片段,可 ...
  • PlistBuddy簡單使用 由於PlistBuddy並不在Mac預設的Path里,所以我們得通過絕對路徑來引用這個工具: 查看幫助 下麵我們來看看PlistBuddy的簡單使用 初始化一個 info.plist 文件 初始化info.plist 初始化info.plist 列印info.plist ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...