昨天我遇到一个问题,我需要在我的baseFragment中的nav_graph.xml中设置动画,并以编程方式从当前节点获取包含enterAnim和exitAnim资源的动作对象。在这里找不到解决方案,所以我们继续。
首先,我们需要将动画和动画文件夹一起放入anim文件夹,因为它很饿。
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="250"
android:fromXDelta="-100%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />
</set>
Run Code Online (Sandbox Code Playgroud)
您可以在github或stackoverflow上轻松找到的其他动画。
这是我的nav_graph.xml片段,我们将从中进行过渡
<fragment
android:id="@+id/kebabsFragment"
android:name="com.kebabkrabby.kebabapp.KebabFragment"
android:label="so many kebabs"
tools:layout="@layout/fragment_kebab">
<action
android:id="@+id/action_kebabs_to_kebab_detail"
app:destination="@id/kebabDetailFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left" />
</fragment>
Run Code Online (Sandbox Code Playgroud)
现在在KebabFragment.tk中,您将调用baseFragment方法进行过渡,以详细了解所需的kebab,然后popFromBackStack
//navigateAndClean(actionId, cleanFragmentId)
navigateAndClean(R.id.action_kebabs_to_kebab_detail, R.id.kebabsFragment)
Run Code Online (Sandbox Code Playgroud)
在我们的baseFragment.kt中
internal fun navigateAndClean(actionId: Int, currentFragmentIdToClear: Int) {
val navBuilder = NavOptions.Builder()
val navController = Navigation.findNavController(getRootView())
val currNavigationNode = navController.graph.findNode(currentFragmentIdToClear) // NavDestination of kebabsFragment object in nav_graph.xml
val action = currNavigationNode?.getAction(actionId) // finally we get this action_kebabs_to_kebab_detail action object
action?.navOptions?.enterAnim?.let { //do we …Run Code Online (Sandbox Code Playgroud) android-animation android-fragments kotlin android-architecture-components android-architecture-navigation