首页 > 解决方案 > 为什么导航控制器不能声明为类变量?

问题描述

我是 android 新手,正在学习一些教程。目前致力于实现导航控制器并覆盖向上按钮功能。这样做的一部分是将操作栏与导航控制器链接并覆盖 onSupportNavigateUp()。在执行此操作时,我注意到我们必须通过 id 获取导航控制器两次,因此我决定创建一个执行此操作的类变量并重新使用该变量。问题是当我这样做时应用程序在启动时崩溃。我的猜测是这是因为我试图在膨胀视图之前获取导航控制器?

所以我的问题是为什么会这样:

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        @Suppress("UNUSED_VARIABLE")
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        val navController = this.findNavController(R.id.myNavHostFragment)
        NavigationUI.setupActionBarWithNavController(this, navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.myNavHostFragment)
        return navController.navigateUp()
    }
}

但这不起作用:

class MainActivity : AppCompatActivity() {

    private val navController = this.findNavController(R.id.myNavHostFragment)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        @Suppress("UNUSED_VARIABLE")
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        NavigationUI.setupActionBarWithNavController(this, navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp()
    }
}

标签: androidkotlin

解决方案


你是对的,你navController在视图膨胀并将null传递给之前分配setupActionBarWithNavController 你可以这样做,

class MainActivity : AppCompatActivity() {

    private lateinit var navController: NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        @Suppress("UNUSED_VARIABLE")
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        NavigationUI.setupActionBarWithNavController(this, navController)
    navController = this.findNavController(R.id.myNavHostFragment)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp()
    }
}

推荐阅读