第四步 界面跳转、参数传递和动画
在WelcomeFragment中,点击登录和注册按钮可以分别跳转到LoginFragment和RegisterFragment中。
WelcomeFragment.
方式一 利用ID导航
目标:WelcomeFragment携带key为name的数据跳转到LoginFragment,LoginFragment接收后显示。
Have a account ? Login按钮的点击事件如下:
btnLogin.setOnClickListener {
// 设置动画参数
valnavOption = navOptions {
anim {
enter = R.anim.slide_in_right
exit = R.anim.slide_out_left
popEnter = R.anim.slide_in_left
popExit = R.anim.slide_out_right
}
}
// 参数设置
valbundle = Bundle
bundle.putString( "name", "TeaOf")
findNavController.navigate(R.id.login, bundle,navOption)
}
后续LoginFragment的接收代码比较简单,直接获取Fragment中的Bundle即可,这里不再出示代码。最后的效果:
LoginFragment
方式二 利用Safe Args
目标:WelcomeFragment通过Safe Args将数据传到RegisterFragment,RegisterFragment接收后显示。
再看一下已经展示过的login_navigation.xml:
...>
...
/>
android:id="@+id/welcome"
>
android:id="@+id/action_welcome_to_login"
app:destination="@id/login"/>
android:id="@+id/action_welcome_to_register"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"
app:destination="@id/register"/>
android:id="@+id/register"
...
>
android:name="EMAIL"
android:defaultValue="2005@qq.com"
app:argType="string"/>
细心的同学可能已经观察到navigation目录下的login_navigation.xml资源文件中的action标签和argument标签,这里需要解释一下:
action标签
属性
作用
app:destination
跳转完成到达的fragment的Id
app:popUpTo
将fragment从栈中弹出,直到某个Id的fragment
argument标签
属性
作用
android:name
app:argType
标签的类型
android:defaultValue
默认值
点击Android studio中的Make Project按钮,可以发现系统为我们生成了两个类:
WelcomeFragment中的JOIN US按钮点击事件:
btnRegister.setOnClickListener {
val action = WelcomeFragmentDirections
.actionWelcomeToRegister
.setEMAIL( "TeaOf1995@Gamil.com")
findNavController.navigate(action)
}
RegisterFragment中的接收:
overridefunonViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)
// ...
valsafeArgs:RegisterFragmentArgs bynavArgs
valemail = safeArgs.email
mEmailEt.setText(email)
}
RegisterFragment
需要提及的是,如果不用Safe Args,action可以由Navigation.createNavigateOnClickListener(R.id.next_action, null)方式生成,感兴趣的同学可以自行编写。
3
更多
Navigation可以绑定menus、drawers和bottom navigation,这里我们以bottom navigation为例,我先在navigation目录下新创建了main_navigation.xml,接着新建了MainActivity,下面则是activity_main.xml:
...>
android:id= "@+id/my_nav_host_fragment"
android:name= "androidx.navigation.fragment.NavHostFragment"
android:layout_width= "match_parent"
app:navGraph= "@navigation/main_navigation"
app:defaultNavHost= "true"
android:layout_height= "0dp"
android:layout_weight= "1"/>
android:id= "@+id/navigation_view"
android:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:background= "@android:color/white"
app:itemIconTint= "@color/colorAccent"
app:itemTextColor= "@color/colorPrimary"
app:menu= "@menu/menu_main"/>
< /LinearLayout>
MainActivity中的处理也十分简单:
classMainActivity: AppCompatActivity{
lateinitvarbottomNavigationView: BottomNavigationView
overridefunonCreate(savedInstanceState: Bundle?){
//...
valhost: NavHostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) asNavHostFragment
valnavController = host.navController
initWidget
initBottomNavigationView(bottomNavigationView,navController)
}
privatefuninitBottomNavigationView(bottomNavigationView: BottomNavigationView, navController: NavController){
bottomNavigationView.setupWithNavController(navController)
}
privatefuninitWidget{
bottomNavigationView = findViewById(R.id.navigation_view)
}
}
效果:
MainActivity
4
总结
上图概括了本文的一些知识点,当然还有一些知识点没有涉及,比如深层连接等,其次,本文只是一篇入门型博客,关于更深层次的学习,本人会逐步进行。本人水平有限,文章难免有误,欢迎指正。
Demo地址:
https://github.com/mCyp/Jetpack
Over~
🚀如果觉得本文不错,可以查看Android Jetpack系列的其他文章:
第二篇:《即学即用Android Jetpack - Data Binding》
https://www.jianshu.com/p/e3b881d80c6d
第三篇:《即学即用Android Jetpack - ViewModel & LiveData》
https://www.jianshu.com/p/81a284969f03
Android官方架构组件Navigation:大巧不工的Fragment管理框架
https://blog.csdn.net/mq2553299/article/details/80445952返回搜狐,查看更多