如何在 NavigationView Header 中获取对 object 的引用
How to get a reference to an object in a NavigationView Header
在我的 activity 中,我通过数据绑定扩充布局。绑定本身工作正常,我可以轻松地在布局文件中获取对 objects 的引用。
其中一个 objects 是 NavigationView
。它有一个 headerLayout
:
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/white"
android:fitsSystemWindows="true"
app:itemIconTint="@color/navigation_view_color"
app:itemTextColor="@color/navigation_view_color"
app:headerLayout="@layout/nav_view_header" />
header 布局如下所示(为简单起见删除了额外的 objects):
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/menu_blue"
android:paddingBottom="32dp">
<ImageView
android:id="@+id/navViewLogOutButton"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:src="@drawable/logout"
app:tint="@color/white"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp"
android:contentDescription="@string/sz.proApp.support.logOut" />
</androidx.constraintlayout.widget.ConstraintLayout>
我需要在此图像视图上设置点击侦听器,但我无法获取对它的引用。这是我正在使用的:
binding.navView.findViewById<ImageView>(R.id.navViewLogOutButton)?.setOnClickListener{
doSomething()
}
我已经确认 binding.navView
不是 null
。另外,通过在那里设置一个断点,我可以看到这个 ImageView
的内存地址是什么。当我将该行更改为:
binding.navView.findViewById<ImageView>(213123403)
我得到了我想要的参考资料。但显然,我不能只使用整数,因为它是动态的。代码编译并启动应用程序。但是当它到达那条线时,每次都 findViewById
returns null。
我读到 findViewById
可能无法在 activity 中使用数据绑定,但如果这是真的,那么我如何才能获得此引用以便我可以设置侦听器?
app:headerLayout="@layout/nav_view_header"
因此,生成的绑定 class 应该是 NavViewHeaderBinding
,您可以通过以下方式获取绑定:
val headerBinding = NavViewHeaderBinding.bind(binding.navView.getHeaderView(0))
并通过 headerBinding
访问 header 视图:
headerBinding.navViewLogOutButton
在我的 activity 中,我通过数据绑定扩充布局。绑定本身工作正常,我可以轻松地在布局文件中获取对 objects 的引用。
其中一个 objects 是 NavigationView
。它有一个 headerLayout
:
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/white"
android:fitsSystemWindows="true"
app:itemIconTint="@color/navigation_view_color"
app:itemTextColor="@color/navigation_view_color"
app:headerLayout="@layout/nav_view_header" />
header 布局如下所示(为简单起见删除了额外的 objects):
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/menu_blue"
android:paddingBottom="32dp">
<ImageView
android:id="@+id/navViewLogOutButton"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:src="@drawable/logout"
app:tint="@color/white"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp"
android:contentDescription="@string/sz.proApp.support.logOut" />
</androidx.constraintlayout.widget.ConstraintLayout>
我需要在此图像视图上设置点击侦听器,但我无法获取对它的引用。这是我正在使用的:
binding.navView.findViewById<ImageView>(R.id.navViewLogOutButton)?.setOnClickListener{
doSomething()
}
我已经确认 binding.navView
不是 null
。另外,通过在那里设置一个断点,我可以看到这个 ImageView
的内存地址是什么。当我将该行更改为:
binding.navView.findViewById<ImageView>(213123403)
我得到了我想要的参考资料。但显然,我不能只使用整数,因为它是动态的。代码编译并启动应用程序。但是当它到达那条线时,每次都 findViewById
returns null。
我读到 findViewById
可能无法在 activity 中使用数据绑定,但如果这是真的,那么我如何才能获得此引用以便我可以设置侦听器?
app:headerLayout="@layout/nav_view_header"
因此,生成的绑定 class 应该是 NavViewHeaderBinding
,您可以通过以下方式获取绑定:
val headerBinding = NavViewHeaderBinding.bind(binding.navView.getHeaderView(0))
并通过 headerBinding
访问 header 视图:
headerBinding.navViewLogOutButton