Navigation
去年的Google I/O大会上,Google推出了Android Jetpack架构组件,Navigation就是其中之一。
本文主要介绍Navigation与BottomNavigationView的简单搭配使用,最后的效果就是这样:
注意:Android Studio版本需要在3.2及以上
一、创建Activity
上图是在一个Activity中显示了3个Fragment,第一步是创建这几个Fragment的容器。
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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".main.MainActivity">
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true"/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/navigation"/>
</LinearLayout>
fragment
-
android:name="androidx.navigation.fragment.NavHostFragment"
和app:defaultNavHost="true"
指定了,在按back键时会返回到NavHostFragment
-
app:navGraph="@navigation/nav_graph"
为这个fragment
组件指定了navGraph
文件
BottomNavigationView
-
app:menu="@menu/navigation"
指定了底部导航栏的菜单配置选项 -
这里库使用的是material而不是design,是因为采用了AndroidX
二、配置menu文件
- 在
res
目录下新建menu
文件夹 - 在
menu
目录中,新建Menu resource file
- 在
text
标签中修改代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/tab1"
android:icon="@mipmap/ic_launcher"
android:title="Tab 1"/>
<item
android:id="@+id/tab2"
android:icon="@mipmap/ic_launcher"
android:title="Tab 2"/>
<item
android:id="@+id/tab3"
android:icon="@mipmap/ic_launcher"
android:title="Tab 3"/>
</menu>
三、配置navigation graph
- 在
res
目录下新建navigation
文件夹 - 在
navigation
目录下,新建Navigation resource file
- 添加所需要导航的Fragment,注意不需要添加Action,不需要连接箭头
- 将每个Fragment对应的ID,修改为
menu
文件中item对应的ID(最重要的一步)
最终的
nav_graph.xml
:
<?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/tab1">
<fragment
android:id="@+id/tab1"
android:name="..."
android:label="..."
tools:layout="@layout/fragment1">
</fragment>
<fragment
android:id="@+id/tab2"
android:name="..."
android:label="..."
tools:layout="@layout/fragment2" />
<fragment
android:id="@+id/tab3"
android:name="..."
android:label="..."
tools:layout="@layout/fragment3">
</fragment>
</navigation>
四、Navigation与BottomNavigationView适配
在MainActivity.java
中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
BottomNavigationView bottomNav = findViewById(R.id.bottom_nav_view);
NavigationUI.setupWithNavController(bottomNav, navController);
}
@Override
public boolean onSupportNavigateUp() {
return Navigation.findNavController(this, R.id.nav_host_fragment);.navigateUp();
}
注意:
NavigationUI.setupWithNavController()
方法,只有在onCreate()中调用才有效