首先介绍一下由来,只属于个人见解。Design包是5.0之后出现的新特性,其包含了许多新出现且具有自己特色的控件。除今天要说的NavigationView导航布局之外,还有TabLayout、RecyclerView、CardView、FloatActionButton、Snackbar、TextInputLayout,还有协调者布局CoordinatorLayout等等等等。
我对于这个的理解个人只是觉得Google不想让android的再一问的去模仿IOS所做出来的效果,有了这个,Google更有了底气。
之后选择design.
成功之后你的build.gradle文件上会多出之后就可以愉快的使用NavigationView啦.
因为是NavigationView,所以定义在DrawerLayout中。所以布局中我们也需要把NavigationView定义在DrawerLayout的根标签下。
首先看一下布局文件 activity_main.xml
xmlns:app="http://schemas.android.com/apk/res-auto"
的命名空间。其中
android:layout_gravity="left"
代表NavigationView从哪边弹出。
app:headerLayout="@layout/header_navigation"
这个属性可以在NavigationView上添加一个头布局。它也是一个xml布局文件。
app:menu="@menu/menu_navigation_main"
这个属性是代表NavigationView中的每一个item,它是一个menu.下面是menu_navigation_main.xml文件
public class MainActivity extends AppCompatActivity {
private Context mContext = this;
private DrawerLayout drawerLayout_main;
private NavigationView navigationView_main;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initActionBar();
}
//初始化ActionBar
private void initActionBar() {
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle("打开抽屉");
actionBar.setDisplayHomeAsUpEnabled(true);
// actionBar.setHomeAsUpIndicator(android.R.drawable.ic_dialog_info);
}
private void initView() {
drawerLayout_main = (DrawerLayout) findViewById(R.id.drawerLayout_main);
navigationView_main = (NavigationView) findViewById(R.id.navigation_main);
tv = ((TextView) findViewById(R.id.tv));
// 设置导航菜单宽度
ViewGroup.LayoutParams params = navigationView_main.getLayoutParams();
params.width = getResources().getDisplayMetrics().widthPixels * 1 / 2;
navigationView_main.setLayoutParams(params);
//设置NavigationView菜单条目的点击监听
navigationView_main.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_common:
Toast.makeText(mContext, "点击了第1个菜单", Toast.LENGTH_SHORT).show();
break;
case R.id.action_menu:
Toast.makeText(mContext, "点击了第2个菜单", Toast.LENGTH_SHORT).show();
break;
case R.id.action_transform:
Toast.makeText(mContext, "点击了第3个菜单", Toast.LENGTH_SHORT).show();
break;
case R.id.action_qq:
Toast.makeText(mContext, "点击了第4个菜单", Toast.LENGTH_SHORT).show();
break;
case R.id.action_weixin:
Toast.makeText(mContext, "点击了第5个菜单", Toast.LENGTH_SHORT).show();
break;
}
item.setChecked(true);
//关闭抽屉
drawerLayout_main.closeDrawer(navigationView_main);
//或者:drawerLayout.closeDrawers();
return true;
}
});
}
//配置ActionBar的home键点击监听
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
//打開左側的抽屜
if (drawerLayout_main.isDrawerOpen(GravityCompat.START)) {
drawerLayout_main.closeDrawer(GravityCompat.START);
} else {
drawerLayout_main.openDrawer(GravityCompat.START);
}
}
return super.onOptionsItemSelected(item);
}
}
// 设置导航菜单宽度
ViewGroup.LayoutParams params = navigationView_main.getLayoutParams();
params.width = getResources().getDisplayMetrics().widthPixels * 1 / 2;
navigationView_main.setLayoutParams(params);
这段是得到屏幕的宽,然后得到它的一半,付给navigationView,这样NavigationView的宽度就是屏幕的一半。
navigationView_main.setNavigationItemSelectedListener()
这个是为NavigationView注册监听事件。根据点击的menu id进行判断。
关闭NavigationView有两种。
一种是用DrawerLayout调用closeDrawer();NavigationView作为参数。
drawerLayout_main.closeDrawer(navigationView_main);
一种是也是closeDrawers();这种不用传递参数。注意看,两种并不一样。
drawerLayout_main.isDrawerOpen(GravityCompat.START)
这个方法是判断NavigationView是否打开。
最后看下效果图:
好了。今天就写到这里。希望大家都能看得明白。
共勉!