如何在 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