最近简单看了下google推出的框架Jetpack,感受此框架的内容能够对平时的开发有很大的帮助,也能够解决不少开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。android
Android Architecture组件是Android Jetpack的一部分,它们是一组库,旨在帮助开发者设计健壮、可测试和可维护的应用程序,包含一下组件:git
上述时Android Architecture所提供的架构组件,本文一块儿来看一下Navigation组件的使用。github
导航架构组件简化了Android应用程序中导航的实现,经过在xml中添加元素并指定导航的起始和目的地,从而在Fragment之间创建链接在Activity中调用xml中设置的导航action从而跳转界面到目的地,简单来讲它和以前在活动中调用startActivity的区别就相似于代码布局和xml中layout布局同样,既简单又可视化,以下图就是一个navigaton的xml图:编程
Navigation多数做用于Fragment中,不过导航组件还支持:Fragment、Activity、导航图和子图、自定义目标bash
3.一、在项目中设置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.二、Navigation编辑器app
3.三、肯定目的地框架
上面的属性选中后都会自动生成xml中的代码,如:编辑器
<fragment android:id="@+id/blankFragment"
android:name="com.example.administrator.navigation.BlankFragment"
android:label="fragment_blank"
tools:layout="@layout/fragment_blank">
</fragment>复制代码
3.四、链接目的地ide
<action
android:id="@+id/action_otherFragment_to_blankFragment" // 在导航时调用此ID设置目的
app:destination="@id/blankFragment" />复制代码
4.一、修改活动导航
//在Activity的xml中添加fragment
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true"
/>
// 在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.二、将目标绑定到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文件
<item android:id="@id/secondFragment"
android:title="Second"
android:icon="@drawable/ic_launcher_foreground"
android:menuCategory="secondary"
app:showAsAction="always"
/>复制代码
val navigationView = findViewById<NavigationView>(R.id.nav_view)
NavigationUI.setupWithNavController(navigationView, findNavController(mainBlankFragment))复制代码
运行结果:
// Set up ActionBar
setSupportActionBar(binding.toolbar)
NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)复制代码
5.一、在目的地之间传递数据
此时的xml中添加了参数
<argument
android:name="value"
app:type="integer"
android:defaultValue="0" /复制代码
代码中,使用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.二、将目标分组为嵌套导航图
<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/navigation"
app:startDestination="@id/blankFragment">
<fragment ....../>
<navigation android:id="@+id/navigation2" app:startDestination="@id/blankFragment">
<fragment android:id="@+id/blankFragment" android:name="com.example.administrator.navigation.BlankFragment"
......
</fragment>
</navigation>
</navigation>复制代码
此时预览图发生如下变化:
下面咱们将上面的两个navigation并使用include引用,拆分以下:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
......>
<fragment android:id="@+id/blankFragment" android:name="com.example.administrator.navigation.BlankFragment"
android:label="fragment_blank" tools:layout="@layout/fragment_blank">
......
<action android:id="@+id/action_blankFragment_to_include" app:destination="@id/secondActivity"/> // 跳转到SecondActivity
//<action android:id="@+id/action_blankFragment_to_include" app:destination="@id/include"/> // 跳转到include
**:注意这里不管设置哪一个,只要是跳转到include中,就会首先到app:startDestination的界面中
</fragment>
<include app:graph="@navigation/include"/>
</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/include" app:startDestination="@id/secondActivity"> // 将include的startDestination设置为SecondActivity因此直接跳到SecondActivity // 必须设置不然会报异常 no start destination defined via app:startDestination
<activity android:id="@+id/secondActivity" android:name="com.example.administrator.navigation.SecondActivity"
android:label="activity_second" tools:layout="@layout/activity_second"/>
</navigation>复制代码
5.三、目标建立深层连接
<deepLink app:uri="https://cashdog.com/sendmoney"/>复制代码
<activity name=".MainActivity">
<nav-graph android:value="@navigation/main_nav" />
</activity>复制代码
5.四、目的地之间建立过渡
此时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.五、条件导航
此时代码自动填充:
// 在最外层自动添加
<action android:id="@+id/action_global_secondFragment2" app:destination="@id/secondFragment"/>复制代码
使用共同目标
viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(view).navigate(R.id.action_global_mainFragment);
}
});复制代码
六、实战
使用Navigation,在Activity实现各自Fragment的导航以及两个Activity间的导航
<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/second" app:startDestination="@id/fragmentT">
<fragment android:id="@+id/fragmentT" android:name="com.example.administrator.navigation.FragmentT"
android:label="fragment_fragment_t" tools:layout="@layout/fragment_fragment_t">
<action android:id="@+id/action_fragmentT_to_fragmentOther" app:destination="@id/fragmentOther"/>
</fragment>
<fragment android:id="@+id/fragmentOther" android:name="com.example.administrator.navigation.FragmentOther"
android:label="fragment_fragment_other" tools:layout="@layout/fragment_fragment_other"/>
</navigation>复制代码
<action android:id="@+id/action_blankFragment_to_secondActivity2" app:destination="@id/second"/>
// 跳转到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组件快要介绍完了,敬请期待