- Navigation Architecture Componen
- Navigation Architecture Componen
- Navigation Architecture Componen
- Navigation Architecture Componen
- Navigation Architecture Componen
- 初尝Android Jetpack 之Navigation
- 浅谈 Android Architecture Componen
- 关于 Android Architecture Componen
- 基于 Android Architecture Componen
- Architecture -- Navigation
6.更换导航过度效果
每个navigat()都有个不怎么滴的过渡效果,behold:
1.gif
默认的转换效果,和其他与调用相关的属性都可以override。can be overridden by including a set of NavOptions. NavOptions uses a Builder pattern which allows you to override and set only the options you need. There's also a ktx DSL for NavOptions, which is what you'll be using.
现在先定义一些动画给转换效果:
添加自定义效果到Transition中
1.打开HomeFragment
2.定义NavOptions,传入navigate()中
val options = 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
}
}
view.findViewById<Button>(R.id.navigate_destination_button)?.setOnClickListener {
findNavController().navigate(R.id.flow_step_one_dest, null, options)
}
3.step 5的东西就不用再保留了
4.运行一下试试看
7.Navigate using actions
导航系统可以通过action进行导航,在导航图中的线条代表着action。
image.png
用action导航比用destination导航多了这么些好处:
- 导航路径能够可视化地观察
- action包含一些可以设置的属性,比如transition动画,参数,backstack behavior
- 可以使用plugin safe args导航,这个随后再说
下面的图展示一个连接了flow_step_one_dest
和 flow_step_two_dest
的action
<fragment
android:id="@+id/flow_step_one_dest"
android:name="com.example.android.codelabs.navigation.FlowStepFragment">
<argument
.../>
<action
android:id="@+id/next_action"
app:destination="@+id/flow_step_two_dest">
</action>
</fragment>
<fragment
android:id="@+id/flow_step_two_dest"
android:name="com.example.android.codelabs.navigation.FlowStepFragment">
<!-- ...removed for simplicity-->
</fragment>
behold:
- action标签在destination from中嵌套
- action中的app:destination指向导航的终点id
- action自己的ID是next_action
再看一个
image.png
<fragment
android:id="@+id/home_dest"
android:name="com.example.android.codelabs.navigation.HomeFragment"
.../>
<fragment
android:id="@+id/flow_step_two_dest"
android:name="com.example.android.codelabs.navigation.FlowStepFragment">
<argument
.../>
<action
android:id="@+id/next_action"
app:popUpTo="@id/home_dest">
</action>
</fragment>
notice:
- ID next_action用来连接了
flow_step_two_dest
和home_dest
,我们可以使用next_action id任意从flow_step_one_dest
或者flow_step_two_dest
进行导航。这表示action提供了一个抽象的行为,可以根据上下文导航到不同的目的地。 -
popUpTo
,使用这个会从back-stack中弹出fragment,until到达home_dest
使用action进行导航
1.打开mobile_navigation.xml
2.在design模式从home_dest
拖一条线线到flow_step_one_dest
3.搞action,添加或修改属性:
- ID = next_action
- Transition for Enter = slide_in_right
- Transition for Exit = slide_out_left
- Transitions for Pop Enter = slide_in_left
- Transitions for Pop Exit = slide_out_right
4.打开HomeFragment
5.给navigate_action_button
添加监听
view.findViewById<Button>(R.id.navigate_action_button)?.setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.next_action, null)
)
6.跑一跑
8.使用safe args
Safe Args
navigation组件有一个Gradle插件,名唤safe args,that generates simple object and builder classes for type-safe access to arguments specified for destinations and actions.
Safe args可以让我们在destination之间传递数据时这样搞代码:
val username = arguments?.getString("usernameKey")
使用生成的getter和setter替代上面:
val username = args.username
因为这是类型安全的, 使用safe args生成类是用action进行导航并且在导航时传递arguments的最佳办法。
使用safe args传递值
1.打开app/build.gradle注意应用插件
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'androidx.navigation.safeargs'
android {
//...
}
2.打开mobile_navigation.xml
,注意flow_step_one_dest
中的arguments是怎么定义的
<fragment
android:id="@+id/flow_step_one_dest"
android:name="com.example.android.codelabs.navigation.FlowStepFragment"
tools:layout="@layout/flow_step_one_fragment">
<argument
android:name="flowStepNumber"
app:argType="integer"
android:defaultValue="1"/>
<action...>
</action>
</fragment>
通过<argment>,safe args生成了一个唤做FlowStepFragmentArgs
的类
<argment>中通过android:name="flowStepNumber"
定义了一个叫做"flowStepNumber"的argment,所以在生成类FlowStepFragmentArgs
中也有一个叫做flowStepNumber
的变量,并且还有getter和setter。
3.打开FlowStepFragment
4.注释掉以下代码
// Comment out this line
// val flowStepNumber = arguments?.getInt("flowStepNumber")
因为这是老式代码,并非类型安全的代码,我们来用safe args撸
5.通过FlowStepFragmentArgs
改造代码,以类型安全的方式获取FlowStepFragment的参数。
val safeArgs = FlowStepFragmentArgs.fromBundle(arguments)
val flowStepNumber = safeArgs.flowStepNumber
Safe Args Direction classes
我们也可以通过safe args用类型安全的方式来导航,参数自选。
这时我们会用到生成的Direction类。
每一个包含action的destination都会生成Direction类,类里包含了为destination中每个action提供的方法。
举个栗子,
navigate_action_button
点击监听可以变成这个样子:
// Note the usage of curly braces since we are defining the click listener lambda
view.findViewById<Button>(R.id.navigate_action_button)?.setOnClickListener{
val action = HomeFragmentDirections.nextAction()
action.setFlowStepNumber(1)
findNavController().navigate(action)
}
网友评论