前言:最近在仿写网易云音乐安卓端界面,记录下所遇到的问题及解决方案
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"