天天看點

Android新導航元件NavController的坑1. Toolbar/ActionBar設定2. menu與navigation中的id比對2. app:defaultNavHost=“true”

1. Toolbar/ActionBar設定

下面的代碼, 可以将導航器 navController 與 Toolbar/ActionBar 綁定.

setupActionBarWithNavController(navController, appBarConfiguration)
           

但是, 如果Activity 使用了Toolbar, 就需要将其使用的Theme設定為noActionBar:

<item name="windowActionBar">false</item>
           

否則就會報錯.

2. menu與navigation中的id比對

如果BottomNavigationView或其它元件使用了menu:

<com.google.android.material.bottomnavigation.BottomNavigationView
       ...
        app:menu="@menu/tab_menu" />
           

而充當容器的fragment設定了navGraph:

<fragment
        android:id="@+id/nav_host_fragment"
        ...
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
        app:navGraph="@navigation/mobile_navigation"
        />
           

請注意 tab_menu 和mobile_navigation 中的id 必須比對:

menu:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_home"
        android:icon="@drawable/tabbar_home"
        android:title="@string/menu_home" />

    <item
        android:id="@+id/menu_categories"
        android:icon="@drawable/tab_bar_category_ic"
        android:title="@string/menu_categories" />
</menu>
           

navigation:

<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/mobile_navigation"
    app:startDestination="@+id/menu_home">
	    <fragment
	        android:id="@+id/menu_home"
	        android:name="cn.douvril.easynews.ui.HomeFragment"
	        android:label="home"
	        tools:layout="@layout/fragment_home1" />
	    <fragment
	        android:id="@+id/menu_categories"
	        android:name="cn.douvril.easynews.ui.CategoryFragment"
	        android:label="category"
	        tools:layout="@layout/fragment_category" />
   </navigation>
           

每一個item和fragment都是一一對應的關系, 而且其id必須相同.

否則, navControl将無法正确比對, 而BottomNavigationView的切換也會出現異常情況.

筆者這裡的異常時無法切換底部的tab.

2. app:defaultNavHost=“true”

可以将第一個fragment設定為導航首頁, 而且當頁面處于其它的fragment時, 按下back鍵, 首先将回退到第一個fragment, 而非直接退出.