1 Navigation Drawer Activity是什么?
硬翻译出来就是导航抽屉Activity,不过翻译出来的意思大概也就是它相应的作用了。
Navigation Drawer是在 Material Design 中推出的一种侧滑导航菜单栏控件。包含两个部分,一部分是侧滑(DrawerLayout),一部分是导航菜单栏(NavigationView)。
1.1 DrawerLayout(抽屉布局)
DrawerLayout布局中,由两部分组成,一部分是内容布局,一部分是侧滑菜单布局。其中侧滑菜单布局通过设置 android:layout_gravity 属性,来控制是左侧滑,还是右侧滑。
右抽屉
<!-- 右抽屉,因为设置了android:layout_gravity="end" -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="end"
android:gravity="center"
android:background="@android:color/white"
android:text="右抽屉"/>
左抽屉
<!-- 左抽屉,因为设置了android:layout_gravity="start" -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:gravity="center"
android:background="@android:color/white"
android:text="左抽屉"/>
1.2 Navigation(导航控件)
NavigationView是兼容包中提供用来实现导航菜单控件。使用menu资源填充数据,可以更简单高效的实现导航菜单。NavigationView分为两部分,一部分是headerLayout,一部分是menu。headerLayout就是对应菜单的顶部部分,一般用来显示用户信息,menu则对应实际的菜单选项,一般配合Fragment使用,打到点击菜单切换Fragment的效果。
<android.support.design.widget.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
2 怎么用?
activity_main.xml
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<!-- layout_gravity控制是左侧滑还是右侧滑:start表示左侧滑,end表示右侧滑 -->
<!--主页面的容器-->
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 导航视图,因为设置了android:layout_gravity="start",所以是左抽屉 -->
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
<!-- 右抽屉,因为设置了android:layout_gravity="end" -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="end"
android:gravity="center"
android:background="@android:color/white"
android:text="右抽屉"/>
</android.support.v4.widget.DrawerLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); // 获取到Toolbar
setSupportActionBar(toolbar); // 添加Toolbar
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); // 获取“浮动按钮”FloatingActionButton
fab.setOnClickListener(new View.OnClickListener() { //设置“浮动按钮”的监听
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); // 获取“抽屉”DrawerLayout
/**
* 创建一个“抽屉”的“开关”ActionBarDrawerToggle到“抽屉”中
* 参数:1.上下文,2.抽屉,3.工具栏toolbar,4.
*/
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle); //设置Drawer设置开关的监听
toggle.syncState(); //同步状态“开关状态”,这里实现了toolbar和Drawer的联动
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); // 获取“导航视图”NavigationView
navigationView.setNavigationItemSelectedListener(this); //设置导航视图中Item的监听
}
/**
* 手机回退键被按下之后调用
*/
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
/**
* 创建Toolbar菜单时调用
* @param menu 菜单的引用
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu); //创建菜单
return true;
}
/**
* 菜单Item被选择时调用
* @param item 被选择的菜单Item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //获取选项ID
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* MainActivity实现的“导航”Navigation的监听
* @param item “导航”Navigation的Item
* @return
*/
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
// Handle the camera action
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START); //关闭“抽屉”
return true;
}
}
3 用在哪里?
一般用于进行“应用的导航”,是一种除了Button Navigation Activity布局方式以外使用得更频繁的布局方式。