Android Widget:DrawerLayout配合Toolbar的使用及常見問題
阿新 • • 發佈:2018-11-26
前言:最近在仿寫網易雲音樂安卓端介面,記錄下所遇到的問題及解決方案
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"