首先說一下這個的實現效果相似咱們如今實現的方式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)