1:目录结构:(源码和总结都放在b站,链接在底部)
2:实现的大概逻辑:
使用drawerlayout抽屉布局实现,并使用navigationview加载头部和底部
3:核心问题一:header控件无法操作
原因:原生的直接在xml里面NavigationView加载了header,致使了无法获取到header布局里面的控件,且不能通过常见的布局获取进行设置;
解决方法是通过navigationview提供的头部布局设置方法动态获取:
View af=navigationView.inflateHeaderView(R.layout.header);
tv=af.findViewById(R.id.wrnm);
ga=af.findViewById(R.id.yhprofile);
4:核心问题二:底部menuitem点击无效
原因:drawerlayout的一个限制,必需得把navigationview放在最下面点击事件才能生效,如果放在其他地方,就会出现点击穿透的情况
<?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/drawerlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>
<androidx.constraintlayout.widget.ConstraintLayout
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="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="parent"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:background="#00BCD4"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.navigation.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/nav_view"
app:menu="@menu/main_menu"
android:layout_gravity="start"/>
</androidx.drawerlayout.widget.DrawerLayout>
5:一个有意思的东西:
圆形imageview
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="250dp"
android:background="@drawable/side_nav_bar"
android:gravity="bottom"
android:orientation="horizontal"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:id="@+id/header">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical"
>
<de.hdodenhof.circleimageview.CircleImageView
android:layout_marginTop="50dp"
xmlns:circleimageview="http://schemas.android.com/apk/res-auto"
android:id="@+id/yhprofile"
android:layout_width="90dp"
android:layout_height="90dp"
android:src="@drawable/logo"
circleimageview:civ_border_color="@color/black"
circleimageview:civ_border_overlay="false"
circleimageview:civ_border_width="1dp"
circleimageview:civ_fill_color="@android:color/holo_blue_light"
android:layout_gravity="center"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Hi~"
android:textColor="@color/black"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<TextView
android:id="@+id/wrnm"
android:paddingLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="***"
android:textColor="@color/black"
/>
</LinearLayout>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/logo"
/>
</LinearLayout>
需要引入依赖
//添加CircleImageView依赖 圆形的imageview
implementation 'de.hdodenhof:circleimageview:2.1.0'
6:b站讲解地址
5android实现侧边栏(解决顶部无法操作控件和底部item点击无效的问题)_哔哩哔哩_bilibili