Android Widget:DrawerLayout配合Toolbar的使用及常见问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kafmws/article/details/83688979

前言:最近在仿写网易云音乐安卓端界面,记录下所遇到的问题及解决方案


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"

猜你喜欢

转载自blog.csdn.net/kafmws/article/details/83688979
今日推荐