Android开发:无法引用NavigationView头部布局视图求助
问题场景
在Android开发中,尝试通过View Binding在Activity里引用NavigationView的头部视图,但动态设置视图属性时没有任何效果。
布局代码(activity_us.xml)
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:fitsSystemWindows="true" tools:context=".UsActivity" tools:openDrawer="start"> <include android:id="@+id/dashboard_home" android:layout_height="match_parent" android:layout_width="match_parent" layout="@layout/home_us"/> <com.google.android.material.navigation.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="false" > <androidx.core.widget.NestedScrollView android:layout_width="wrap_content" android:layout_height="match_parent" android:fillViewport="true" > <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="wrap_content" android:layout_height="match_parent"> <TextView android:id="@+id/textView10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:background="@drawable/grey_stroke_128dp_corners" android:elevation="20dp" android:fontFamily="@font/roboto" android:gravity="center_horizontal" android:lineSpacingExtra="5sp" android:paddingHorizontal="25dp" android:paddingVertical="13dp" android:text="Sign out" android:textColor="#d7111111" android:textSize="15sp" android:textStyle="normal" app:layout_constraintEnd_toStartOf="@+id/textView31" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/activity_us_nav_view" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/activity_us_nav_view" /> <TextView android:id="@+id/textView31" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/green_background_128dp_corners" android:fontFamily="@font/roboto" android:gravity="center_horizontal" android:lineSpacingExtra="5sp" android:paddingHorizontal="65dp" android:paddingVertical="13sp" android:text="Go back" android:textColor="#ebffffff" android:textSize="15sp" android:textStyle="normal" app:layout_constraintBottom_toBottomOf="@+id/textView10" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/textView10" app:layout_constraintTop_toTopOf="@+id/textView10" /> <com.google.android.material.navigation.NavigationView android:id="@+id/activity_us_nav_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="start" android:fitsSystemWindows="false" app:elevation="0dp" app:headerLayout="@layout/nav_header_layout" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toStartOf="@+id/textView10" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:menu="@menu/nav_drawer_menu" /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.core.widget.NestedScrollView> </com.google.android.material.navigation.NavigationView> </androidx.drawerlayout.widget.DrawerLayout>
原Activity代码(无效果)
val headerView: View = binding.activityUsNavView.getHeaderView(0) val headerBinding: NavHeaderLayoutBinding = NavHeaderLayoutBinding.inflate(LayoutInflater.from(headerView.context)) // 无效果的设置代码 headerBinding.navHeaderCloseImageView.setImageDrawable(resources.getDrawable(R.drawable.atm))
错误原因
调用NavHeaderLayoutBinding.inflate()会重新创建一个全新的头部视图实例,这个实例并没有被添加到当前界面的NavigationView中。后续设置的是这个新实例的属性,而界面上显示的是通过app:headerLayout加载的原有头部视图,所以看不到任何效果。
修正方案
使用NavHeaderLayoutBinding.bind(headerView)方法,将Binding对象绑定到NavigationView已经加载好的头部视图上,而非重新创建新视图。
修正后的Activity代码
val headerView: View = binding.activityUsNavView.getHeaderView(0) val headerBinding: NavHeaderLayoutBinding = NavHeaderLayoutBinding.bind(headerView) // 现在设置属性会生效 headerBinding.navHeaderCloseImageView.setImageDrawable(resources.getDrawable(R.drawable.atm))
补充说明
getHeaderView(0)获取的是NavigationView中第一个已加载的头部视图(对应app:headerLayout设置的布局)bind()方法用于绑定已存在的View实例,inflate()用于从XML创建新的View实例,两者使用场景需区分
内容的提问来源于stack exchange,提问作者Sirqoharastus
相关产品推荐
相关产品推荐

