带有操作栏图标单击的 NavigationUI 导致片段淡入淡出

Posted

技术标签:

【中文标题】带有操作栏图标单击的 NavigationUI 导致片段淡入淡出【英文标题】:NavigationUI with actionbar icon clicks result in fragments fading in and out 【发布时间】:2020-04-19 16:34:12 【问题描述】:

我有一个带有图标的操作栏,当点击这些图标时,会在屏幕上显示相应的片段。这与导航图无关。当在操作栏中单击相应的图标时,我正在使用NavigationUI.onNavDestinationSelected 方法导航到相应的片段。当我使用导航图通过片段内的按钮单击操作等在片段之间导航时,没有动画,但是当我单击操作栏图标时,它会导致相应的片段慢慢淡入和淡出。我该怎么做才能禁用它?

包含 NavHostFragment 的主要活动:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.navigation.NavController
import androidx.navigation.Navigation
import androidx.navigation.ui.NavigationUI
import com.google.android.material.snackbar.Snackbar

class MainActivity : AppCompatActivity() 

    private lateinit var navController: NavController

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

        navController = Navigation.findNavController(this, R.id.navHostFragment)

        NavigationUI.setupActionBarWithNavController(this, navController)

        //supportActionBar?.setDisplayHomeAsUpEnabled(true)
        //setSupportActionBar(toolbar)
    

    override fun onSupportNavigateUp(): Boolean 

        onBackPressed()
        return true

    

    //TODO: add options in overflow menu to add new category and a new task
    override fun onCreateOptionsMenu(menu: Menu?): Boolean 
        menuInflater.inflate(R.menu.main_menu, menu)
        return super.onCreateOptionsMenu(menu)
    

    override fun onOptionsItemSelected(item: MenuItem): Boolean 

        when (item.itemId)
        
            R.id.app_settings -> 

                //just to test it out
                Snackbar.make(findViewById(R.id.main_activity_container), "app settings option clicked", Snackbar.LENGTH_LONG).show()
                true

            R.id.main_pomo_settings -> 

                //just to test it out
                Snackbar.make(findViewById(R.id.main_activity_container), "pomo settings option clicked", Snackbar.LENGTH_LONG).show()
                true
        

        return NavigationUI.onNavDestinationSelected(item!!, navController)  || super.onOptionsItemSelected(item)
    

【问题讨论】:

【参考方案1】:

我找到了自己问题的解决方案。您必须通过在 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

    右键单击res文件夹(如果不存在anim文件夹)并选择New -> Android Resource File 为资源类型选择动画 输入nav_default_enter_anim作为文件名,然后点击确定。 对其他文件重复此操作,但这次右键单击动画文件夹。

在每个文件中加入以下内容:

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

【讨论】:

为什么官方文档里没有这个?

以上是关于带有操作栏图标单击的 NavigationUI 导致片段淡入淡出的主要内容,如果未能解决你的问题,请参考以下文章

如何更改操作栏中下拉菜单的背景颜色

带有xcode9的ios11中没有显示导航图标?

如何在swift / SwiftUI中为滑动手势设置菜单栏图标的操作

深入浅出 NavigationUI | MAD Skills

带有可折叠侧边栏菜单 Swift 的 UITapGestureRecognizer

单击带有字体真棒图标的按钮时,表单不提交