最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。
Android Architecture组件是Android Jetpack的一部分,它们是一组库,旨在帮助开发者设计健壮、可测试和可维护的应用程序,包含一下组件:
上述时Android Architecture所提供的架构组件,本文一起来看一下Navigation组件的使用。
导航架构组件简化了Android应用程序中导航的实现,通过在xml中添加元素并指定导航的起始和目的地,从而在Fragment之间建立连接在Activity中调用xml中设置的导航action从而跳转界面到目的地,简单来说它和之前在活动中调用startActivity的区别就类似于代码布局和xml中layout布局一样,既简单又可视化,如下图就是一个navigaton的xml图:
Navigation多数作用于Fragment中,不过导航组件还支持:Fragment、Activity、导航图和子图、自定义目标
3.1、在项目中设置Navigation
dependencies {
def nav_version = "1.0.0-alpha06"
implementation "android.arch.navigation:navigation-fragment:$nav_version"
implementation "android.arch.navigation:navigation-ui:$nav_version"
androidTestImplementation "android.arch.navigation:navigation-testing:$nav_version"
}
3.2、Navigation编辑器
3.3、确定目的地
上面的属性选中后都会自动生成xml中的代码,如:
3.4、连接目的地
4.1、修改活动导航
//在Activity的xml中添加fragment
// 在Activity中设置Navcontroller
override fun onSupportNavigateUp()
= findNavController(nav_host_fragment).navigateUp()
val finalHost = NavHostFragment.create(R.navigation.example_graph)
supportFragmentManager.beginTransaction()
.replace(R.id.nav_host_fragment, finalHost)
.setPrimaryNavigationFragment(finalHost)
.commit()
4.2、将目标绑定到UI小部件
使用NavController该类导航到目的地,系统提供以下获取NavController的方法:
检索 NavController,使用其 navigate() 方法传入navigation.xml中设置的导航action,执行导航到目标
btnFragment.setOnClickListener {
Navigation.findNavController(btnFragment).navigate(R.id.action_blankFragment_to_secondFragment)
}
除了上面的navigation()方法外,还可以调用NavController.navigateUp() 和 NavController.popBackStack() 方法“向上”或“返回”,或使用 Navigation类的 createNavigateOnClickListener() 便捷方法导航到目标
button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null))
执行上面的导航,点击按钮跳转到第二个Fragment
// 导航抽屉菜单xml文件
val navigationView = findViewById(R.id.nav_view)
NavigationUI.setupWithNavController(navigationView, findNavController(mainBlankFragment))
运行结果:
// Set up ActionBar
setSupportActionBar(binding.toolbar)
NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
5.1、在目的地之间传递数据
此时的xml中添加了参数
代码中,使用navigate() 方法创建一个Bundle并将其传递到目标
val bundle = Bundle()
bundle.putString("name","Blank")
bundle.putInt("number",10)
Navigation.findNavController(btnFragment).navigate(R.id.action_blankFragment_to_secondFragment,bundle)
// 在接收的代码中,使用该 getArguments()方法检索包并使用其内容
val tv = view.findViewById(R.id.textViewAmount)
text.text = "Name = ${arguments?.getString("name")}
Number = ${arguments?.getInt("number")}"
5.2、将目标分组为嵌套导航图
此时预览图发生以下变化:
下面我们将上面的两个navigation并使用include引用,拆分如下:
......
// 跳转到SecondActivity
// // 跳转到include
**:注意这里无论设置哪个,只要是跳转到include中,就会首先到app:startDestination的界面中
// 将include的startDestination设置为SecondActivity所以直接跳到SecondActivity // 必须设置否则会报异常 no start destination defined via app:startDestination
5.3、目标创建深层链接
5.4、目的地之间创建过渡
此时xml中会自动补充代码:
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"
5.5、条件导航
此时代码自动填充:
// 在最外层自动添加
使用共同目标
viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(view).navigate(R.id.action_global_mainFragment);
}
});
6、实战
使用Navigation,在Activity实现各自Fragment的导航以及两个Activity间的导航
// 跳转到second导航
btnActivity.setOnClickListener {
val option = ActivityOptionsCompat.makeSceneTransitionAnimation(activity as Activity, imageView, "image")
val exeras = ActivityNavigator.Extras(option)
Navigation.findNavController(btnFragment)
.navigate(R.id.action_blankFragment_to_secondActivity2, null, null, exeras)
到此Navigation的使用介绍就结束了,Navigation的使用确实使应用导航的设计变得更加简单,还有个更大的好处就是阅读性极好,在以往我们查看项目时,要想得到导航需要在代码中就行查看,现在直接可以查看xml文件即可,是不是很方便,好了Android Jetpack组件快要介绍完了,敬请期待
本文Navigation的Demo,欢迎Star