Jetpack组件android,一起来学 Android Jetpack 架构组件 Navigation

第四步 界面跳转、参数传递和动画

在WelcomeFragment中,点击登录和注册按钮可以分别跳转到LoginFragment和RegisterFragment中。

c5478b7538bf0f845623477681616533.png

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即可,这里不再出示代码。最后的效果:

25f59fdf3744eb9519e9d9cb198e5e7f.png

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按钮,可以发现系统为我们生成了两个类:

72ad1eb992a2d2a28bb5e4e8b3f2c999.png

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)

}

55a7aa412e19a2efa3c9f38b1ed5fdab.png

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)

}

}

效果:

1364b7c953ae160516b5b87b74abfb38.png

MainActivity

4

总结

77b59468c932d1c5218f031d7dfb5b7a.png

上图概括了本文的一些知识点,当然还有一些知识点没有涉及,比如深层连接等,其次,本文只是一篇入门型博客,关于更深层次的学习,本人会逐步进行。本人水平有限,文章难免有误,欢迎指正。

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返回搜狐,查看更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值