1. 程式人生 > >Android Widget:DrawerLayout配合Toolbar的使用及常見問題

Android Widget:DrawerLayout配合Toolbar的使用及常見問題

前言:最近在仿寫網易雲音樂安卓端介面,記錄下所遇到的問題及解決方案


DrawerLayout的基礎使用

DrawerLayout經常配合NavigationView及Toolbar使用,編寫側滑欄

1.首先新增支援

implementation 'com.android.support:design:28.0.0'

2.編寫佈局

  • DrawerLayout是一種佈局控制元件,類似LinearLayout,但最好作為根佈局使用
  • DrawerLayout佈局中預設有兩個控制元件,第一個是主介面的佈局/控制元件,第二個是側滑欄中的佈局(經常使用NavigationView)
  • 側滑欄中的佈局/控制元件必須設定layout_gravity屬性。設定了layout_gravity="start/left"的檢視才會被認為是側滑選單,表示側滑選單是在左邊還是右邊,如果不設定,在開啟關閉側滑欄的時候會出錯
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    android:id="@+id/dl_homePage"
    android:layout_width="match_parent"
    android:layout_height
="match_parent" android:fitsSystemWindows="true" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<!--第一個控制元件,側滑欄不顯示時的介面--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation
="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.v7.widget.Toolbar android:id="@+id/tb_title" android:fitsSystemWindows="true" android:background="@color/colorNetease" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.Toolbar> <android.support.v4.view.ViewPager android:id="@+id/vp_main" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </android.support.v4.view.ViewPager> </LinearLayout> <!--第二個控制元件,側滑欄的介面--> <android.support.design.widget.NavigationView android:id="@+id/navigation" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" app:menu="@menu/moudule_menu_drawerlayout" app:headerLayout="@layout/module_headerlayout_navigation"> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>

3.在邏輯中監聽事件開啟側滑欄

public class MainActivity extends AppCompatActivity {

    private Button btn_openDrawer;
    private DrawerLayout drawerLayout;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module_activity_main);
        btn_openDrawer = findViewById(R.id.btn_openDrawer);
        btn_openDrawer.setOnClickListener((view)->drawerLayout.openDrawer(GravityCompat.START););
        //這裡傳入GravityCompat.START因為layout_gravity屬性設定為start
	}
}
基本方法
boolean isDrawerOpen(@EdgeGravity int drawerGravity): 判斷選單是否開啟

openDrawer(@EdgeGravity int gravity) : 開啟選單

closeDrawer(@EdgeGravity int gravity) : 關閉選單

以上三個方法傳入引數:
GravityCompat.START : 左邊選單
GravityCompat.END : 右邊選單

addDrawerListener(@NonNull DrawerListener listener) : 新增監聽
DrawerListener 類
onDrawerSlide(View drawerView, float slideOffset): 滑動時呼叫
onDrawerOpened(View drawerView): 開啟選單時呼叫
onDrawerClosed(View drawerView): 關閉選單時呼叫
onDrawerStateChanged(@State int newState): 選單狀態改變時呼叫

配合Toobar的使用

用Toolbar代替ActionBar並設定home鍵用於調出DrawerLayout

常見問題

1.將側滑欄高度延伸至狀態列

step one:
側滑欄所在Activity中onCreate方法中加入以下程式碼使狀態列透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           getWindow().setStatusBarColor(Color.TRANSPARENT);
       }
       getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
step two:
對應xml檔案DrawerLayout佈局中
設定屬性
android:fitsSystemWindows="true"