Android jetpack Navigation 动画与参数 效果与安全

Posted 安果移不动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android jetpack Navigation 动画与参数 效果与安全相关的知识,希望对你有一定的参考价值。

接上篇博客

https://blog.csdn.net/mp624183768/article/details/124919837?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124919837%22%2C%22source%22%3A%22mp624183768%22%7D&ctrtid=ImZke

 

添加动画首先要选中action

然后点击右边的动画

 

添加上动画然后就可以啦。这里动画时间很短150ms 如果想看效果 可以自己复制一份改改那样效果会好很多

修改详情页面的布局

<?xml version="1.0" encoding="utf-8"?>
<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/my_nav_graph"
    app:startDestination="@id/homeNavigationFragment">

    <fragment
        android:id="@+id/homeNavigationFragment"
        android:name="com.anguomob.jecpack.fragment.HomeNavigationFragment"
        android:label="fragment_home_navigation"
        tools:layout="@layout/fragment_home_navigation" >
        <action
            android:id="@+id/action_homeNavigationFragment_to_detailNavigationFragment"
            app:destination="@id/detailNavigationFragment"
            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" />
    </fragment>
    <fragment
        android:id="@+id/detailNavigationFragment"
        android:name="com.anguomob.jecpack.fragment.DetailNavigationFragment"
        android:label="fragment_detail_navigation"
        tools:layout="@layout/fragment_detail_navigation" >
        <action
            android:id="@+id/action_detailNavigationFragment_to_homeNavigationFragment"
            app:destination="@id/homeNavigationFragment" />
    </fragment>
</navigation>

上面加了个Text用来显示传递过来的数据 

传递参数

使用Bundle

home点击的时候传递进去

        binding.btHome.setOnClickListener 
            val args=Bundle();
            args.putString("username","jack")

            val findNavController = Navigation.findNavController(it)
            findNavController.navigate(R.id.action_homeNavigationFragment_to_detailNavigationFragment,args)
        

detail接受的时候展示出来

    override fun onActivityCreated(savedInstanceState: Bundle?) 
        super.onActivityCreated(savedInstanceState)
        val username = arguments?.getString("username");
        binding.tvUserName.text = username ?: "没传递过来数据"
        binding.btDetail.setOnClickListener 

            val findNavController = Navigation.findNavController(it)
            findNavController.navigate(R.id.action_detailNavigationFragment_to_homeNavigationFragment)
        
    

但是这种方式如果使用

val username = arguments?.getInt("username");

 getInt那么就会为0 

有点不严谨的意思

所以Navigation提供了更好的方式safe-args

修改

my_nav_graph.xml

在要跳转的页面 也就是home 要往detail 跳转 就是设置home上面

添加

     <argument
            android:name="username"
            android:defaultValue="未知"
            app:argType="string" />

        <argument
            android:name="age"
            app:argType="integer"
            android:defaultValue="0"
            />

 

 

 integer 是代表int  string不必多说

添加依赖

kt方式与java不同

这里主要讲

kt

项目级别build.gradle  (java可能不需要。需要你们java同学自己试试)

buildscript 
    dependencies 
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.4.2")
    

但是java  app级别需要添加 (kt不需要添加这句话 我已经试过了)

 implementation 'androidx.navigation:navigation-safe-args-gradle-plugin:2.4.2'

 

 kt app级别 顶部

 id 'androidx.navigation.safeargs.kotlin'

 

java

androidx.navigation.safeargs

 

java的话就不要完全模仿kotlin了。初始化方式也不相同

homeFragment

java方式应该是  

HomeNavigationFragmentArgs.Build().setUserName("jack").setAge(18).build().toBundle()

 kt

          val args = HomeNavigationFragmentArgs("jack",18).toBundle()
            val findNavController = Navigation.findNavController(it)
            findNavController.navigate(
                R.id.action_homeNavigationFragment_to_detailNavigationFragment,
                args
            )

detailFragment 接受数据 这个java和kt是一样的

    override fun onActivityCreated(savedInstanceState: Bundle?) 
        super.onActivityCreated(savedInstanceState)
        arguments?.let 
            val args = HomeNavigationFragmentArgs.fromBundle(it);
            val username = args.username
            val age = args.age
             binding.tvUserName.text = "username:" + username + "age:" + age ?: "没传递过来数据"

        

        binding.btDetail.setOnClickListener 

            val findNavController = Navigation.findNavController(it)
            findNavController.navigate(R.id.action_detailNavigationFragment_to_homeNavigationFragment)
        
    

有的网友觉得过程反而更复杂了。

有的网友觉得更加清晰了。

各有利弊吧。那就是

以上是关于Android jetpack Navigation 动画与参数 效果与安全的主要内容,如果未能解决你的问题,请参考以下文章

Android Jetpack架构组件带你了解Android Jetpack

Android Jetpack简介

Android Jetpack架构组件——什么是Jetpack?

Android Jetpack架构组件——什么是Jetpack?

《Android Jetpack从入门到精通+高级Jetpack强化实战》,最新Jetpack系列开发笔记开源

Android高级Jetpack架构组件+Jetpack compose强化实战