Navigation概述:
导航是指支持用户导航、进入和退出应用中不同内容片段的交互。Android Jetpack 的导航组件可帮助您实现导航,无论是简单的按钮点击,还是应用栏和抽屉式导航栏等更为复杂的模式,该组件均可应对。导航组件还通过遵循一套既定原则来确保一致且可预测的用户体验。
导航组件由以下三个关键部分组成:
导航图:在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单个内容区域(称为目标)以及用户可以通过应用获取的可能路径。
NavHost:显示导航图中目标的空白容器。导航组件包含一个默认 NavHost 实现 (NavHostFragment),可显示 Fragment 目标。
NavController:在 NavHost 中管理应用导航的对象。当用户在整个应用中移动时,NavController会安排 NavHost 中目标内容的交换。
在应用中导航时,您告诉 NavController,您想沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController 便会在 NavHost 中显示相应目标。
导航组件提供各种其他优势,包括以下内容:
处理 Fragment 事务。
默认情况下,正确处理往返操作。
为动画和转换提供标准化资源。
实现和处理深层链接。
包括导航界面模式(例如抽屉式导航栏和底部导航),用户只需完成极少的额外工作。
Safe Args - 可在目标之间导航和传递数据时提供类型安全的 Gradle 插件。
ViewModel 支持 - 您可以将 ViewModel 的范围限定为导航图,以在图表的目标之间共享与界面相关的数据。
以上是谷歌官网的概述,这里是引用而简述,下面我们开始实际的使用示例吧!
官方navigation使用入门传送门
从官方文档中我们可以看出,navigation使用比较重要的三点就是
1:NavHost
2:NavHostFragment
3:NavController
同样我们首先要做的就是要在gradle中引入依赖如下:
//navigation
def nav_version ="2.3.0-alpha01"
// Java language implementation
implementation"androidx.navigation:navigation-fragment:$nav_version"
implementation"androidx.navigation:navigation-ui:$nav_version"
1:首先我们要做的前期工作就是要创建一个activity和两个fragment留着接下来使用。
2:点击同步之后,首先我们鼠标右键点击res->new->android Resoure File如下:
然后选择
3:创建好了之后,点击视图上面有一个添加fragment的按钮,点击添加我们刚才创建好的fragment,添加了第一个之后我们能够看到上面有一个窗口加小红×的标志点击添加第二个fragment
如下:
4:添加完成之后我们再次鼠标右键点击res->new->android Resoure File创建menu文件如下:
5:创建好之后我们添加两个item其xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
android:id="@+id/iukFragment"
android:icon="@android:drawable/ic_dialog_email"
android:title="Iuk" />
android:id="@+id/youFragment"
android:icon="@drawable/ic_filter_vintage_black_24dp"
android:title="you" />
</menu>
我们需要注意的是两个item的id要分别和之前的两个fragment 的id对应相同
6:以上都准备完全了之后我们回到activity对应的布局文件中分别添加BottomNavigationView组件和fragment
布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".navigation.NavigationActivity">
android:id="@+id/fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="408dp"
android:layout_height="688dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0"
app:navGraph="@navigation/nav_graph" />
android:id="@+id/bottomNavigationView"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="#6e6e6e"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.995"
app:menu="@menu/nav_menu">
</androidx.constraintlayout.widget.ConstraintLayout>
需要注意的是fragment中的app:defaultNavHost="true"表示这个fragment是作为主容器,app:navGraph="@navigation/nav_graph" 设置导航文件。
BottomNavigationView中app:menu="@menu/nav_menu"设置按钮文件
7:现在我们要在activity中进行NavController操作了代码如下:
public class NavigationActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation);
BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView);
NavController navController =Navigation.findNavController(this, R.id.fragment);
AppBarConfiguration appBarConfiguration =new AppBarConfiguration.Builder(bottomNavigationView.getMenu()).build();
//进行界面绑定
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(bottomNavigationView, navController);
}
}
当这一切都准备完成了之后一个简单的navigation示例就完成了,接下来运行看看吧!
点击左边按钮效果如下,
点击右边按钮下过如下:
好了,到达了我们想要的效果了,是不是很简单,快快用到你的项目中去吧!
想要demo的同学可以到这里来,github传送门这里有前面两篇文章将的demo都在里面,想要的同学都可以下载。