【问题标题】:Creating Navigation Drawer using View Binding使用视图绑定创建导航抽屉
【发布时间】:2021-10-19 07:18:40
【问题描述】:

我正在尝试使用视图绑定制作导航抽屉,由于某种原因,当我创建与布局文件中的视图相对应的绑定变量(在 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 时,它工作正常。但是我在网上看到的所有教程都没有使用这种方法,所以即使我可以绕过这个问题,我也无法找到它的根源。

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

【问题讨论】:

  • 从你的 xml 中的 DrawerLayout 中删除这一行,你会很高兴的:tools:viewBindingIgnore="true"
  • @JeelVankhede 这行得通!非常感谢

标签: android xml android-studio kotlin android-viewbinding


【解决方案1】:

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

根据View Binding的文档

如果您希望在生成绑定类时忽略布局文件,请将 tools:viewBindingIgnore="true" 属性添加到该布局文件的根视图。

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

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多