使用视图绑定创建导航抽屉

Creating Navigation Drawer using View Binding

我正在尝试使用视图绑定制作导航抽屉,出于某种原因,当我创建与布局文件中的视图相对应的绑定变量(在 kotlin 文件中)的属性时,它给了我一个未解决的参考错误。

这是 MainActivity kotlin 代码:

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        setUpToolbar()

        val actionBarDrawerToggle = ActionBarDrawerToggle(          
            this@MainActivity,
            binding.root,
            R.string.open_drawer,
            R.string.close_drawer)
        binding.root.addDrawerListener(actionBarDrawerToggle)       
        actionBarDrawerToggle.syncState()

        binding.navigationView.setNavigationItemSelectedListener {

            when(it.itemId){
                R.id.dashboard -> {
                    Toast.makeText (
                        this@MainActivity,
                        "Clicked on Dashboard",
                        Toast.LENGTH_LONG
                    ).show()
                }
                R.id.favourites -> {
                    Toast.makeText (
                        this@MainActivity,
                        "Clicked on favourites",
                        Toast.LENGTH_LONG
                    ).show()
                }
                R.id.profile -> {
                    Toast.makeText (
                        this@MainActivity,
                        "Clicked on profile",
                        Toast.LENGTH_LONG
                    ).show()
                }
                R.id.aboutApp -> {
                    Toast.makeText (
                        this@MainActivity,
                        "Clicked on about",
                        Toast.LENGTH_LONG
                    ).show()
                }
            }

            return@setNavigationItemSelectedListener true
        }


    }

    fun setUpToolbar(){
        supportActionBar?.title = "Toolbar Title"               
        supportActionBar?.setHomeButtonEnabled(true)            
        supportActionBar?.setDisplayHomeAsUpEnabled(true)      
    }
    override fun onOptionsItemSelected(item: MenuItem): Boolean {     
        val id = item.itemId                                            
        if(id == android.R.id.home){                                    
            binding.root.openDrawer(GravityCompat.START)               
        }
        return super.onOptionsItemSelected(item)
    }
}

这是我的 xml 代码:

<androidx.drawerlayout.widget.DrawerLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/drawerLayout"
    tools:context=".MainActivity"
    tools:viewBindingIgnore="true" >

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize"
        android:background="@color/design_default_color_primary_dark"
        android:theme="@style/ThemeOverlay.AppCompat.Dark"/>

    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/menu_drawer"
        android:layout_gravity = "start"/>

</androidx.drawerlayout.widget.DrawerLayout>

我的主要问题是 onCreate() 方法中的 binding.navigationView.setNavigationItemSelectedListener 行。 navigationView 部分显示为红色,当我 运行 代码时,它显示该行上的 "unresolved reference" 错误。我不明白为什么会这样。在直接编写该代码之前,我需要声明一些变量吗?

此外,我在不同的地方使用了 binding.root 作为 binding.drawerLayout 的替代品,因为如果我在其中使用 binding.drawerLayout,比如 ActionBarDrawerToggle 参数,它会再次出现显示未解决的参考错误。但是当我使用 binding.root 时它工作正常。但是我在网上看到的所有教程都没有使用这种方法,所以即使我可以绕过这个问题,我也无法找到它的根源。

我试过使缓存失效、清理和重建项目,但没有奏效。如果有人能指出我哪里错了就太好了

问题出在根标签上使用的属性 tools:viewBindingIgnore="true"(本例中为 DrawerLayout)。

根据 View Binding

的文档

If you want a layout file to be ignored while generating binding classes, add the tools:viewBindingIgnore="true" attribute to the root view of that layout file.

在这种情况下,O.P。想要生成绑定 类 但视图绑定忽略了由于此属性而导致的错误。