现学现用Android Jetpack - Navigation,Android高分面试指南

150 阅读2分钟

如果你要使用SafeArgs插件,还要在项目目录下的build.gradle文件添加:

buildscript {

ext.navigationVersion = “2.0.0”

dependencies {

classpath “androidx.navigation:navigation-safe-args-gradle-plugin:$navigationVersion”

}

}

以及模块下面的build.gradle文件添加:

apply plugin: ‘kotlin-android-extensions’

apply plugin: ‘androidx.navigation.safeargs’

第二步 创建navigation导航

创建基础目录:资源文件res目录下创建navigation目录 -> 右击navigation目录New一个Navigation resource file 创建一个Destination,如果说navigation是我们的导航工具,Destination是我们的目的地,在此之前,我已经写好了一个WelcomeFragment、LoginFragment和RegisterFragment,添加Destination的操作完成后如下所示:

除了可视化界面之外,我们仍然有必要看一下里面的内容组成,login_navigation.xml:

android:id=“@+id/login_navigation”

app:startDestination=“@id/welcome”>

android:id=“@+id/login”

android:name=“com.joe.jetpackdemo.ui.fragment.login.LoginFragment”

android:label=“LoginFragment”

tools:layout=“@layout/fragment_login”

/>

android:id=“@+id/welcome”

android:name=“com.joe.jetpackdemo.ui.fragment.login.WelcomeFragment”

android:label=“LoginFragment”

tools:layout=“@layout/fragment_welcome”>

…/>

…/>

android:id=“@+id/register”

android:name=“com.joe.jetpackdemo.ui.fragment.login.RegisterFragment”

android:label=“LoginFragment”

tools:layout=“@layout/fragment_register”

…/>

我在这里省略了一些不必要的代码。让我们看一下navigation标签的属性:

| 属性 | 解释 |

| — | — |

| app:startDestination | 默认的起始位置 |

第三步 建立NavHostFragment

我们创建一个新的LoginActivity,在activity_login.xml文件中:

…>

android:id=“@+id/my_nav_host_fragment”

android:name=“androidx.navigation.fragment.NavHostFragment”

app:navGraph=“@navigation/login_navigation”

app:defaultNavHost=“true”

android:layout_width=“match_parent”

android:layout_height=“match_parent”/>

有几个属性需要解释一下:

| 属性 | 解释 |

| — | — |

| android:name | 值必须是androidx.navigation.fragment.NavHostFragment,声明这是一个NavHostFragment |

| app:navGraph | 存放的是第二步建好导航的资源文件,也就是确定了Navigation Graph |

| app:defaultNavHost="true" | 与系统的返回按钮相关联 |

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

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

这里我使用了两种方式实现:

方式一 利用ID导航

目标:WelcomeFragment携带key为name的数据跳转到LoginFragment,LoginFragment接收后显示。

Have a account ? Login按钮的点击事件如下:

btnLogin.setOnClickListener {

// 设置动画参数

val navOption = 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

}

}

// 参数设置

val bundle = Bundle()

bundle.putString(“name”,“TeaOf”)

findNavController().navigate(R.id.login, bundle,navOption)

}

后续LoginFragment的接收代码比较简单,直接获取Fragment中的Bundle即可,这里不再出示代码。最后的效果:

方式二 利用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 |

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。