Androidx navigation + bottomNavigationView 基本使用

首先說一下這個的實現效果相似咱們如今實現的方式ViewPager切換fragment,咱們能夠更簡單,更優雅的實現咱們的目標,畢竟Google推出的框架嘛,感受仍是不錯的,我的感受仍是得看一下官方文檔,雖然是英文,不過一點點翻譯唄,每一步都講得蠻細的。android

首先配置一下gradle:web

implementation 'android.arch.navigation:navigation-fragment:1.0.0'
implementation 'android.arch.navigation:navigation-ui:1.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation "com.android.support:support-v4:28.0.0"

接下來咱們就可使用相關的api啦!api

首先咱們新建一個activity,叫MainActivity,佈局文件以下:app

<fragment
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/navigation"
    app:defaultNavHost="true"
    app:navGraph="@navigation/nav_graph" />

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:layout_alignParentBottom="true"
    app:menu="@menu/my_navigation_items" />

首先咱們看到咱們切換的頁卡view是BottomNavigationView ,上面換成了fragment角標,這裏的id能夠隨意給,name咱們必須聲明成androidx.navigation.fragment.NavHostFragment ,否則找不到映射的fragment。 框架

這裏的defaultNavHost屬性爲true,要求咱們在跳轉到下一個fragment以後,返回鍵的相應是回到上一個fragment這個和webView的histtory是同樣的。ide

重點是navGraph這個屬性,咱們定義這個navigation文件:佈局

如上圖所示,新建這個navigation文件夾的過程也很簡單:gradle

而後輸入名字,肯定便可。ui

這樣咱們就能夠在佈局裏面作一些咱們本身要作的事情了,個人文件以下:this

你們看到了裏面包含了三個fragment,咱們再看一下佈局文件:

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/nav_graph"
    app:startDestination="@id/blankFragment">

    <fragment
        android:id="@+id/blankFragment"
        android:name="com.example.jespactdemo.BlankFragment"
        android:label="fragment_blank"
        tools:layout="@layout/fragment_blank"
        />
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.jespactdemo.SecondFragment"
        android:label="secondfragment"
        tools:layout="@layout/secondfragment"
        />
    <fragment
        android:id="@+id/mineFragment"
        android:name="com.example.jespactdemo.MineFragment"
        android:label="fragment_mine"
        tools:layout="@layout/fragment_mine"
        />
</navigation>

除了最外層的角標不同以外,其他的跟咱們平時寫的xml很相似,咱們聲明瞭fragment,指明瞭預覽layout,這裏的id咱們先記着很重要,後面我再說。

咱們發如今navigation裏面有一個屬性startDestination,咱們指明瞭blankFragment,再看看design的時候,blankFragment預覽圖左上角有一個小房子的圖案:

這說明咱們activity第一次進來的時候關聯顯示的fragment就是它了。

接下來咱們再看看底部切換佈局怎麼實現,首先咱們建立一個menu文件夾,而後在建立一個menu的xml,裏面的內容以下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/blankFragment"
        android:title="消息"
        android:icon="@mipmap/ic_launcher" />
    <item android:id="@+id/secondFragment"
        android:title="首頁"
        android:icon="@mipmap/ic_launcher" />
    <item android:id="@+id/mineFragment"
        android:title="個人"
        android:icon="@mipmap/ic_launcher" />
</menu>

這裏很簡單,你們都能看得懂,這裏咱們注意一下這裏的id,以前我說過建立fragment的時候聲明的id也很重要,這二者的有什麼關係呢?關係就是咱們必定要一一對應,徹底同樣才能夠造成映射關係。
 

最後咱們看一下MainActivity的實現:

mBottomNav = findViewById(R.id.navigation);
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupWithNavController(mBottomNav, navController);
@Override
public boolean onSupportNavigateUp() {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, appBarConfiguration)
            || super.onSupportNavigateUp();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.onNavDestinationSelected(item, navController)
            || super.onOptionsItemSelected(item);
}

主要就是這兩行代碼便可,還要重寫這兩個方法來實現點擊就能夠切換了,首先咱們要獲取到NavController 對象,這個對象獲取有三種方式,這是其中一種了,而後調用NavigationUI這個類setup底部頁卡和NavController 就關聯起來了,這樣就實現了切換功能,很重要的一點就是menu 的選項id必定要和nav的fragment的id保持一致,至此就完結了,咱們發現咱們省了不少切換邏輯代碼,還有不少xml佈局,這讓咱們承載fragment的activity更加輕鬆簡潔,大大縮短了邏輯代碼,還有一個提示:頁卡切換fragment咱們也能夠在nav佈局設置哦D)

相關文章
相關標籤/搜索