如何避免在Navigation Graph中重复设置Action动画属性?
当然可以!你完全可以像复用Android视图样式那样,通过定义导航动作样式来复用这些动画配置,彻底摆脱在每个action里重复写一堆动画属性的麻烦。下面是具体的实现方法:
方法1:定义可复用的导航动画样式
首先在res/values/styles.xml文件中创建一个继承自Widget.Navigation.FragmentContainerView.Action的样式,把你需要复用的动画属性都写进去:
<style name="DefaultNavActionAnimation" parent="Widget.Navigation.FragmentContainerView.Action"> <item name="enterAnim">@anim/slide_in_right</item> <item name="exitAnim">@anim/slide_out_left</item> <item name="popEnterAnim">@anim/slide_in_left</item> <item name="popExitAnim">@anim/slide_out_right</item> </style>
方法2:在单个Action中引用样式
修改你的Navigation Graph配置,去掉每个action里重复的动画属性,只需要添加app:actionStyle来引用刚才定义的样式即可:
<fragment android:id="@+id/main_fragment" android:name="com.example.myapp.MainFragment" tools:layout="@layout/fragment_main" > <action android:id="@+id/action_main_fragment_to_movies_fragment" app:destination="@id/movies_fragment" app:actionStyle="@style/DefaultNavActionAnimation"/> </fragment>
方法3:全局默认样式(更高效)
如果你的绝大多数action都需要用这套动画,还可以直接在Navigation Graph的根标签设置全局默认动作样式,这样所有action都会自动应用这套动画,不用逐个添加:
<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/nav_graph" app:startDestination="@id/main_fragment" app:defaultActionStyle="@style/DefaultNavActionAnimation"> <!-- 这里放置你的所有Fragment和Action配置 --> </navigation>
额外说明
- 如果某个action需要特殊的动画配置,只需要在该action里单独设置动画属性即可,它会覆盖全局或引用的样式中的属性。
- 这种方式和Android的样式复用逻辑完全一致,后续要修改动画效果时,只需要修改
styles.xml里的样式定义,所有引用该样式的action都会自动生效,极大提升了维护效率。
内容的提问来源于stack exchange,提问作者Jorn
相关产品推荐
相关产品推荐

