drawerlayout是一种可以隐藏的导航栏,非常适合屏幕控件有限的移动设备使用,具体效果如下图。
drawerlayout可以设置在屏幕的左侧或者右侧,通过在屏幕左侧向右滑动来打开,或是在右侧向左滑动打开
使用了drawerlayout的xml布局文件如下
其中需要注意的是,DrawerLayout中要包含一个主内容(此处为FrameLayout)用来作为填充的内容,以及一个ListView作为导航栏。
特别要注意的是,由于DrawerLayout是从前往后叠起来的结构,所以ListView必须放在最后,否则在你点击导航栏时,会点到后面的FrameLayout中的内容
ListView中需要设定属性来确定其为导航栏
android:layout_gravity="start"
其中start设定导航栏在左侧,end则为右侧
然后我们在使用这个布局的activity中进行进一步的设置,在oncreate方法中加入下列内容
ListView listView=(ListView)findViewById(R.id.left_drawer);
String[] mMenuTitles=getResources().getStringArray(R.array.teacher_drawer_list);
try {
ArrayAdapter arrayAdapter = new ArrayAdapter<>(this, R.layout.drawer_list,mMenuTitles);
listView.setAdapter(arrayAdapter);
}catch (Exception e){
e.printStackTrace(System.out);
}
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
selectItem(position);
}
});
为左侧的菜单栏填充内容,并设定监听
其中菜单栏的内容在strings.xml中设定如下
- 学生列表
- 作业列表
- 练习列表
- 考试列表
- 作业分数
随后定义几个Fragment作为activity的内容填充,并在在导航栏变化时进行切换
增加私有成员变量
private StudentListFragment studentListFragment;
private ExamListFragment examListFragment;
private HomeworkListFragment homeworkListFragment;
private ExerciseListFragment exerciseListFragment;
private AssignmentScoreFragment assignmentScoreFragment;
增加selectItem函数
private void selectItem(int position){
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
switch (position){
case 0:
if(studentListFragment==null){
studentListFragment=new StudentListFragment();
}
transaction.replace(R.id.frame,studentListFragment);
transaction.commit();
break;
case 1:
if(homeworkListFragment==null){
homeworkListFragment=new HomeworkListFragment();
}
transaction.replace(R.id.frame,homeworkListFragment);
transaction.commit();
break;
case 2:
if(exerciseListFragment==null){
exerciseListFragment=new ExerciseListFragment();
}
transaction.replace(R.id.frame,exerciseListFragment);
transaction.commit();
break;
case 3:
if(examListFragment==null){
examListFragment=new ExamListFragment();
}
transaction.replace(R.id.frame,examListFragment);
transaction.commit();
break;
case 4:
if(assignmentScoreFragment==null){
assignmentScoreFragment=new AssignmentScoreFragment();
}
transaction.replace(R.id.frame,assignmentScoreFragment);
transaction.commit();
break;
}
}
但是此时,并不会默认选中其中一项,并打开对应的fragment,因此在oncreate的最后增加如下代码
listView.setItemChecked(1,true);
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
if(homeworkListFragment==null){
homeworkListFragment=new HomeworkListFragment();
}
transaction.replace(R.id.frame,homeworkListFragment);
transaction.commit();
但是此时,每次需要滑动仍有些不便,我们需要增加toolbar帮助我们打开导航栏
点击左上角按钮可以打开导航栏,再次点击就会关闭
要做到这点,首先我们需要修改AndroidManifest.xml,将appication中的theme设为
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
将默认的ActionBar去掉,然后定义自己toolbar,新建toolbar.xml文件,内容如下
单独定义toolbar的目的是重用,然后我们就可以在我们需要的activity的布局文件中加入该toolbar了
第二个子项为之前的drawerlayout
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
myToolbar.setNavigationIcon(R.drawable.ic_drawer);
setSupportActionBar(myToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, myToolbar, R.string.drawer_open,
R.string.drawer_close);
mDrawerToggle.syncState();
mDrawerLayout.setDrawerListener(mDrawerToggle);
然后就完成了我们的全部工作了