【发布时间】: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