要想实现抽屉式的效果,在以前咱们大都是使用的SlidingMenu
等第三方库。不过Google
发布了DrawerLayout
来实现相同的效果。各有优缺点吧。这里咱们介绍NavigationView
的使用。
先来看下最终的效果。java
先看下实际运行的效果。感受仍是蛮不错的吧android
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_main" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="55dp" android:background="@color/main" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:title="Title" app:titleTextColor="@color/white"/> </LinearLayout> <android.support.design.widget.NavigationView android:id="@+id/nav_main" android:layout_width="250dp" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/layout_nav_header" app:itemIconTint="@null" app:itemTextColor="#009688" app:menu="@menu/nav"/> </android.support.v4.widget.DrawerLayout>
须要注意的是,须要按照官方文档中的说明将你的布局放在NagigationView
的上方。否则会有一些意想不到的效果,就由于这个,以前吃了挺大的亏。
经过headerLayout
设置menu的头视图。经过menu
属性设置每个item。NavigationView
有几个属性:git
itemBackground
: 设置每个item的背景颜色。itemIconTint
: 改变menu
中的图标颜色itemTextAppearance
:设置每一个item的字体样式。itemTextColor
:设置每一个item的文字颜色。设置toggle
和DrawerLayout
进行联动。方法很简单。就几句代码。github
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.open, R.string.close); toggle.syncState(); drawer.addDrawerListener(toggle);
经过设置NavigationItemSelectedListener
来为每个条目设置点击事件。app
navigation.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.nav_music: break; case R.id.nav_movie: break; case R.id.nav_setting: break; } return false; } });
当抽屉展开的时候,点击返回按钮收起收起,代码很简单。ide
@Override public void onBackPressed() { if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } }
GitHub地址布局