如何在使用Android Navigation组件时移除默认的动画过渡?

11

我正在使用Navigation组件,并在主Activity中有一个底部导航视图。当我点击底部导航栏中的选项卡时,似乎会出现淡入动画效果,我不认为我手动设置了该动画,看起来这个动画是默认存在的。

我想要移除这个动画效果。下面是我在MainActivity中使用的代码。

class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener {

    private lateinit var navController : NavController
    lateinit var destinationTitleTextView : TextView
    lateinit var progressBar : ProgressBar
    lateinit var topToolbar : Toolbar
    lateinit var bottomNavigationView : BottomNavigationView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        FirebaseApp.initializeApp(this)

        // Initial Setup views
        navController = Navigation.findNavController(this,R.id.nav_host_fragment)
        setupBottomNavMenu(navController)
        setupActionBar(navController)
        setUpViewDeclaration()


        // Add Listeners
        navController.addOnDestinationChangedListener(this)


    }



    private fun setUpViewDeclaration() {
        destinationTitleTextView = findViewById(R.id.destination_label_text_view)
        progressBar = findViewById(R.id.progressBar_main_activity)
        topToolbar = findViewById(R.id.top_toolbar)
        bottomNavigationView = findViewById(R.id.bottom_nav)

    }

    private fun setupBottomNavMenu(navController: NavController) {
        bottom_nav.setupWithNavController(navController)
    }


    private fun setupActionBar(navController: NavController) {

        setSupportActionBar(top_toolbar)
        supportActionBar?.setDisplayShowTitleEnabled(false)

        // set up top hierarchy destination
        val appBarConfiguration = AppBarConfiguration(setOf(
            R.id.destination_home,
            R.id.destination_search,
            R.id.destination_user_control,
            R.id.destination_create_event)
        )

        top_toolbar.setupWithNavController(navController,appBarConfiguration)

    }


}
3个回答

22

更新:最新的文件路径请参见下面的评论。


您可以添加anim文件以替换默认动画。

  • res/anim/nav_default_enter_anim.xml
  • res/anim/nav_default_exit_anim.xml
  • res/anim/nav_default_pop_enter_anim.xml
  • res/anim/nav_default_pop_exit_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--Empty to disable animation-->
</set>

[导航组件] 我无法从NavigationUI.setupWithNavController()更改动画


2
仅仅添加文件并没有改变动画。我需要在哪里引用它们? - A1m
通常情况下,您不需要引用它。您的文件名和路径完全相同吗? - Kiwi Lin
我做到了。通过向 navigate() 提供动画,我成功让它工作了。 - A1m
7
请注意,这不是导航组件支持的功能,将来版本的导航组件将无法支持此功能,并且在使用命名空间资源时,该功能也将不受支持。 - ianhanniballake
8
жЦЗдїґеЇФиѓ•еЬ®res\animatorеМЕдЄ≠гАВ - Andrei Manolache

6
@HvSimon 提供了一个设定全局默认值的解决方案,但是对我不起作用。 同时,我想针对每个过渡选择/禁用动画。
您可以使用 NavOptions 对象向 navigate() 提供额外参数。
首先,在 res 文件夹中创建一个动画文件,如 res/anim/nav_enter_anim.xml(如果不需要动画,则为空)。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--Empty to disable animation-->
</set>

创建一个动画xml文件来制作一个动画,或者重复使用同一个xml文件。然后在你的navigate()调用中提供一个NavOptions对象,如下所示:
val animationOptions = NavOptions.Builder().setEnterAnim(R.anim.nav_enter_anim)
            .setExitAnim(R.anim.nav_exit_anim)
            .setPopEnterAnim(R.anim.nav_pop_enter_anim)
            .setPopExitAnim(R.anim.nav_pop_exit_anim).build()

findNavController().navigate(MyFragmentDirections.toMainActivity(), animationOptions)

2
根据此问题

NavigationUI是一组遵循材料设计指南的帮助程序,其中包括BottomNavigationView项目之间的动画。

而且您会在Material Design指南的转换部分中注意到,他们明确指出:

使用交叉淡入淡出动画在活动和非活动底部导航目标之间进行过渡。

因此,Navigation不提供任何自定义或删除动画的API。
请注意,Navigation 2.1.0-alpha03发布版有以下更改:

NavigationUI提供的默认动画从400ms加速到220ms,以匹配活动和片段的默认动画速度。 b/130055522

因此,我建议1)升级到Navigation 2.1.0-alpha03或更高版本以获得更新的动画和2)遵循材料设计指南。
当然,NavigationUI是完全可选的,您可以使用NavigationUI底层使用的OnDestinationChangedListener做任何您想要的事情。

这些动画可以在操作系统设置中禁用吗?还是我们应该担心它们会使 Espresso 测试不稳定? - Achraf Amil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接