在學習之前,我們先得知道側邊導航欄是什么?
它是一個 可以讓內容從屏幕邊緣滑出的布局容器,由安卓官方提供,用于創建側邊菜單,通常搭配
NavigationView
使用;
添加依賴:
在app下的build.gradle中添加以下代碼:
implementation 'androidx.appcompat:appcompat:1.6.1'implementation 'com.google.android.material:material:1.11.0'implementation 'androidx.drawerlayout:drawerlayout:1.2.0'implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
我們還需要在導包的時候修改一下:
把
import android.widget.Toolbar;
修改成
import androidx.appcompat.widget.Toolbar;
做好之后,我們就正式的開始學習了;
DrawerLayout的基本結構和用法
其實導航欄的實現就是靠DrawerLayout來實現的,我把概念放在下面:
DrawerLayout 是一個允許內容從屏幕邊緣滑出顯示的布局,適合放置菜單、用戶信息或頁面切換功能。它可以從**左邊(start)或右邊(end)**滑出,通常用于構建帶有側邊欄的 Material Design 風格 App。
DrawerLayout的功能和特點
1. 側滑菜單功能:DrawerLayout 提供側邊滑出菜單的實現,允許用戶通過滑動屏幕邊緣或點擊按鈕打開抽屜菜單,提升界面簡潔性和可用性;
2. 支持左右兩側菜單:支持從屏幕的左側或右側分別展示抽屜菜單。通過 layout_gravity="start"
(左側)和 layout_gravity="end"
(右側)來指定;
3. 與 Toolbar 集成:可以與 Toolbar
和 ActionBarDrawerToggle
配合使用,在 Toolbar 上顯示圖標,通過點擊圖標打開或關閉抽屜;
4. 內建動畫效果:DrawerLayout 自動提供抽屜打開和關閉的動畫效果。主內容視圖可以根據抽屜的滑動進行遮擋或平移,增強用戶體驗;
5. 支持監聽抽屜事件:提供 DrawerListener
,可以監聽抽屜的打開、關閉、滑動、狀態變化等事件,方便開發者根據抽屜狀態執行相關操作。
6. 適配不同屏幕大小:DrawerLayout 可以自動適配小屏和大屏設備,適用于手機和平板等不同尺寸的屏幕,支持響應式布局。
7. 結合 NavigationView 使用:常與 NavigationView
配合使用,后者提供了方便的菜單項管理、頭部布局和選中狀態功能,適合構建標準的側邊導航菜單。
我們來講講代碼,在代碼中通過講解它的屬性,布局等來學習:
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayoutxmlns: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/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent"><androidx.appcompat.widget.Toolbarandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id = "@+id/toolbar"app:subtitle="子標題"app:title="標題"app:navigationIcon="@drawable/title"></androidx.appcompat.widget.Toolbar><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:layout_gravity="center"android:layout_marginTop="300dp"/></LinearLayout><com.google.android.material.navigation.NavigationViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:id = "@+id/nav_view"android:layout_gravity="start"app:headerLayout="@layout/nax_drawer_header"app:menu = "@menu/nav_drawer_menu"></com.google.android.material.navigation.NavigationView></androidx.drawerlayout.widget.DrawerLayout>
小知識點:
關于布局方面,我們需要學習兩點:
- 這里我們可以看到,drawerlayout布局中,可以放置多個子布局,但是子布局的順序很重要:drawerlayout布局中,第一個子布局必須是app的主內容,后續的子布局才能是你的側邊導航欄;
官方規定:drawerlayout的第一個子view會被視為“主界面”,后續的view會被視為抽屜視圖,比如側邊欄;
- DrawerLayout 最多只能有兩個直接子 View;
什么是直接子view,給大家舉個例子?
比如上圖,中間的兩個子view都是直接子view;
<DrawerLayout><LinearLayout> <FrameLayout /> <NavigationView /> </LinearLayout>
</DrawerLayout>
在上圖中,<FrameLayout />?就不是直接子view了;
回顧代碼:
<DrawerLayout><FrameLayout /> or ConstraintLayout<NavigationView />
</DrawerLayout>
關于主界面中所需要用到的Toolbar:
第一個view:Toolbar
Toolbar 是 Android 中用于替代傳統 ActionBar 的一個可高度自定義的頂部導航欄控件。它通常位于屏幕頂部,承載著應用的標題、導航按鈕(如返回箭頭或抽屜菜單圖標)、操作菜單(如搜索、分享)等元素;
Toolbar 的特點:
靈活可定制:可以自由設置布局、樣式、顏色和內容,比傳統 ActionBar 更加靈活;
兼容性好:支持在不同 Android 版本中統一外觀;
可嵌入布局中:不像 ActionBar 固定,Toolbar 可以作為普通視圖嵌入到任意布局,方便自定義設計;
支持導航控件:例如左上角圖標,常用于控制 DrawerLayout 的開合;
總結一下:Toolbar 就是你 App 界面頂部的“工具欄”,負責承載導航和操作入口;
這里不做過多的介紹,簡要告訴大家屬性:
<androidx.appcompat.widget.Toolbarandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id = "@+id/toolbar"app:subtitle="子標題"app:title="標題"app:navigationIcon="@drawable/title"></androidx.appcompat.widget.Toolbar>
在這段代碼中:
比較生疏的屬性就三個:
app:subtitle="子標題" 設置副標題,顯示在主標題下方,一般用來補充信息,比如當前子頁面名、狀態等。
app:title="標題" 設置 Toolbar 的主標題,通常顯示應用名稱或當前頁面名稱
app:navigationIcon="@drawable/title" 設置左側的導航圖標,比如常見的“返回箭頭”或“漢堡菜單”圖標,用于導航或打開 DrawerLayout 抽屜。
這是這么設置后的效果;
第二個布局是NavigationView,我們來系統的介紹一下吧;
NavigationView
主要介紹:
NavigationView
是 Android 支持庫中提供的一個專門用于配合 DrawerLayout 實現側邊導航菜單的控件。它本質上是一個可滾動的菜單容器,通常放在 DrawerLayout 的“抽屜”部分,用于顯示應用的導航條目。
它的主要作用:
顯示菜單項:可通過
menu
屬性引用菜單 XML 文件(menu.xml
),自動生成可點擊的導航項;支持添加頭部視圖:通過
app:headerLayout
屬性或 Java 代碼添加用戶頭像、昵稱、背景等內容;與 DrawerLayout 搭配:放在 DrawerLayout 的第二個子視圖中,用來顯示側邊導航欄;
支持狀態高亮、點擊事件:點擊某個菜單項自動高亮,可以配合
NavigationItemSelectedListener
實現頁面跳轉;自帶 Material Design 風格:默認支持波紋點擊動畫、圖標與文本組合布局等;
<com.google.android.material.navigation.NavigationViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:id = "@+id/nav_view"android:layout_gravity="start"app:headerLayout="@layout/nax_drawer_header"app:menu = "@menu/nav_drawer_menu"></com.google.android.material.navigation.NavigationView>
app:menu:
引用一個菜單 XML 文件,定義導航項app:headerLayout:
引用一個布局 XML 文件,作為導航頭部android:layout_gravity="start":
指定抽屜從哪邊滑出,通常是start
表示左側,end代表右側;itemIconTint
,itemTextColor:
設置菜單圖標和文字的顏色
app:menu:菜單的定義?
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/it_title"android:title="更改頭像"/><itemandroid:id="@+id/it_name"android:title="修改昵稱"/><itemandroid:id="@+id/it_chatperson"android:title="在線人數"/><itemandroid:id="@+id/it_gotochat"android:title="去聊天"/><itemandroid:id="@+id/it_exit"android:title="退出"/>
</menu>
?app:headerLayout :
導航頭部
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="300dp"android:orientation="vertical"><ImageViewandroid:layout_width="70dp"android:layout_height="70dp"android:src = "@drawable/title1"android:layout_marginTop="100dp"android:layout_gravity="center"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id = "@+id/tv_title"android:layout_marginTop="20dp"android:layout_gravity="center"android:text="個人中心"/>
</LinearLayout>
?關于監聽事件
navigationView = findViewById(R.id.nav_view);Toolbar toolbar = findViewById(R.id.toolbar);setSupportActionBar(toolbar);DrawerLayout drawerLayout = findViewById(R.id.main);toolbar.setNavigationOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {drawerLayout.openDrawer(Gravity.LEFT);}});
這是關于toolbar開啟側邊欄視圖的代碼:?
獲取
toolbar
,設置為當前 Activity 的ActionBar;
setSupportActionBar(toolbar)
使 Toolbar 能使用 ActionBar 的功能,比如標題、返回按鈕、菜單等;Toolbar 左上角“導航按鈕”的點擊事件監聽器;
手動打開左側的抽屜(Gravity.LEFT 表示“左側抽屜”);
? ?drawerLayout.openDrawer(Gravity.LEFT);這句手動打開抽屜視圖的代碼,同時我們也可以為按鈕設立點擊事件;
drawerLayout.closeDrawer(Gravity.RIGHT);
同時我們也可以手動關閉側邊欄?;
下面是關于每個菜單項的點擊事件,我們可以利用點擊事件達到我們想要的結果;
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {int id = menuItem.getItemId();if(id == R.id.it_chatperson){Toast.makeText(MainActivity.this,"chatperson",Toast.LENGTH_SHORT).show();}else if(id == R.id.it_exit){Toast.makeText(MainActivity.this,"exit",Toast.LENGTH_SHORT).show();}else if(id == R.id.it_gotochat){Toast.makeText(MainActivity.this,"gotochat",Toast.LENGTH_SHORT).show();}else if(id == R.id.it_name){Toast.makeText(MainActivity.this,"name",Toast.LENGTH_SHORT).show();}else if(id == R.id.it_title){Toast.makeText(MainActivity.this,"title",Toast.LENGTH_SHORT).show();}return true;}});
給 NavigationView 設置一個 菜單點擊事件監聽器setNavigationItemSelectedListener(...)
是 NavigationView 專用的方法;
最后完成的效果如下:?
本次分享到此結束!?