使用视图绑定创建导航抽屉
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。想要生成绑定 类 但视图绑定忽略了由于此属性而导致的错误。
我正在尝试使用视图绑定制作导航抽屉,出于某种原因,当我创建与布局文件中的视图相对应的绑定变量(在 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。想要生成绑定 类 但视图绑定忽略了由于此属性而导致的错误。