昨天我遇到了一个问题,需要在我的baseFragment中从nav_graph.xml设置动画,并以编程方式获取包括enterAnim和exitAnim资源的当前节点的操作对象。在这里找不到解决方案,因此我们开始吧。
首先,我们需要在res文件夹中提供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>
你可以在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>
现在在KebabFragment.tk中,您将调用baseFragment方法进行转换以进入所需kebab的详细信息,然后从回退栈中弹出
//navigateAndClean(actionId, cleanFragmentId)
navigateAndClean(R.id.action_kebabs_to_kebab_detail, R.id.kebabsFragment)
在我们的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 have animation or not?
navBuilder.setEnterAnim(it)
}
action?.navOptions?.exitAnim?.let {
navBuilder.setExitAnim(it)
}
navBuilder.setPopUpTo(currentFragmentIdToClear, true) //remove from backstack
navController.navigate(actionId, null, navBuilder.build())
}
有些人会问: "嘿,Kebab先生,我该如何获得getRootView()
?",而Kebab先生则会看着你说:“伙计,看看这个世界,我们一起可以取得很大的成就。”
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
rootView = inflater.inflate(mContentLayoutResourceId, container, false)
return rootView
}
fun getRootView(): View {
return rootView
}
小麦肉串。享受美食。
KebabFragment
继承自baseFragment
吗?在我看来,该操作已经嵌入了转换,为什么需要重新应用它们? - StachunavigateAndClean
的操作具有转换时,它们不会自动应用,需要手动应用,对吗? - StachunavController.navigate(actionId, null, action?.navOptions)
呢?它不能解决问题吗? - Stachu