为什么 Navigation Drawer 项目模板 (Studio 3.6.1) 没有在 Android Nougat 上加载正确的控制器?

Why doesn't Navigation Drawer project template (Studio 3.6.1) load correct controller on Android Nougat?

问题背景

我只是从项目模板中选择了 Navigation Drawer Template(参见图中突出显示的项目),构建了应用程序并 运行 在模拟器上 Android Nougat (v7) API24).

问题

当我打开菜单和 select 另一个项目时,它不会加载新项目(通过控制器的新片段)。

更多问题详情

  1. 应用程序从这里开始...(主页片段 - 第一张图片)。
  2. 我单击图库菜单项(第二张图片),主页片段仍然显示(见第一张图片)。

我试过的

我 运行 在另一个模拟器上 运行 宁 Android Pie 并且它按预期工作 - 当我单击画廊菜单项时,画廊片段加载并且我看到 "This is Gallery fragment".

我尝试过的其他东西

我也打开了 logcat 然后点击了菜单项,但是没有任何显示,即使我关闭了所有过滤器。

相关模板代码

onCreate 中 MainActivity 中的模板代码(加载片段和控制器,初始化所有内容)如下所示:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)

        val fab: FloatingActionButton = findViewById(R.id.fab)
        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()
        }

 // ###########################################################
 // #### MY NOTES -- This is the relevant code ################

        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        val navView: NavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        appBarConfiguration = AppBarConfiguration(setOf(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow), drawerLayout)
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

我可以登录什么/在哪里来确定发生了什么?

你能告诉我为什么会这样吗?
或者,您能给我一个想法,我可以在其中放置一些日志记录语句来确定正在触发的内容,以便我可以判断出什么是失败的吗?

更新 - 附加信息

模板肯定有问题,因为 mobile_navigation.xml 引用了项目中根本不存在的 class:

即使此项目中不存在 app.actionmobile.navdraw.ui.home.HomeSecondFragment,应用程序仍会生成 运行。 唔.... 不知道这怎么可能。

仅供参考 - 这是由项目模板添加的,不是我添加的。

我试过的其他东西 我将 mobile_navigation.xml 的顶部更改为:

app:startDestination="@+id/nav_home"

 app:startDestination="@+id/nav_gallery"

已测试图库片段是否会作为第一个片段加载并且没有问题。

重述问题

我再次遇到的问题是菜单项的 selection 不会在 Nougat 上加载新片段,但会在 Pie 上加载。 不确定平台如何解决这个问题???

我终于能够解决这个问题。

模板项目中的旧依赖项

首先我必须更新一堆过时的包(它们是由默认项目模板添加的)。

以下是依赖项的差异。当然,红的是旧的,绿的是新的:

奇怪的事情

然而,奇怪的是,当您更新这些依赖项时,您会收到一条警告,指出 modelView class 已被弃用。它在 Studio 中看起来像这样(在每个片段中——全部由项目模板定义:

我用谷歌搜索了这个问题,发现代码需要修改,所以它使用:

import androidx.lifecycle.ViewModelProvider

注意它是单数的(相对于旧的 ViewModelProviders)...有点棘手。

您还必须更改每一个 Fragments,它们引用它来构建 viewModel,因此代码如下所示:

galleryViewModel =
                ViewModelProvider.AndroidViewModelFactory.getInstance(Application())
                    .create(GalleryViewModel::class.java)

进行这些更改并重建后,该应用程序将不会有任何已弃用的调用,菜单项也适用于我的牛轧糖图像。

成功!

它在不同版本的 OS 上表现不同,这仍然很奇怪。但是,对于未定义的行为,这可能是预期的。

您可能是对的,一些旧的依赖项引用可能会导致 NavigationUI 的一般实现出现问题和冲突。不幸的是,我通过以下方式在新创建的项目中遇到了同样的问题:

Android Studio 4.0.1
构建 #AI-193.6911.18.40.6626763,构建于 2020 年 6 月 25 日
运行时版本:1.8.0_242-release-1644-b01 amd64

我终于发现,除了您的建议之外,我还必须在 MainActivity 的 onCreate 方法结束之前添加以下行:

 val navView: NavigationView = findViewById(R.id.nav_view) as NavigationView
 navView.setupWithNavController(navController)
 ...

 // Extra line:
 navView.bringToFront()