以前学习DrawerLayout的用法
接下来,在主窗口的代码文件中,向DrawerLayout中添加元素(也就是向ListView中添加元素)
在上面我们调用invalidateOptionsMenu()的时候,系统会自动调用onPrepareOptionsMenu()这个函数
所以我们需要重写它,来让菜单弹出的时候,ActionBar上面的图标自动隐藏
然后同步ActionBar和DrawerLayout
最后,根据Google开发手册的建议,添加上:
首先在你想要添加DrawerLayout的xml文件中,用
</android.support.v4.widget.DrawerLayout>
包围整个XML文件,给赋予命名空间,(xmlns:android="http://schemas.android.com/apk/res/android")
(可能并不需要这样,由于使用比较少,我一般使用SlidingMenu,所以没有测试。。。。。。)
最终效果是这样:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/Draw_Layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout>
//主界面的一些东西
</LinearLayout>
//ListView与LinearLayout或者RelativeLayout是并列的
<ListView //但是一定要ListView在下面
android:id="@+id/List_View"
android:layout_width="240dp" //这个不要超过360dp,给用户留下一点空间,可以看到后面的东西
android:layout_height="match_parent"
android:layout_gravity="start" //这个值必须要指定,start是从左侧拖拽出菜单,end是从右侧
android:background="#ffd0e5ff" //而不推荐使用left,right
android:choiceMode="singleChoice" //单选
android:divider="@android:color/transparent" //背景透明
android:dividerHeight="0dp"> //项间距为0
</ListView>
</android.support.v4.widget.DrawerLayout>
接下来,在主窗口的代码文件中,向DrawerLayout中添加元素(也就是向ListView中添加元素)
private DrawerLayout drawerLayout;
private ListView listView;
private ArrayList<String> menuList;
private ArrayAdapter<String> arrayAdapter;
drawerLayout= (DrawerLayout) findViewById(R.id.Draw_Layout);
listView= (ListView) findViewById(R.id.List_View);
menuList = new ArrayList<String>();
for (int ai = 0; ai < 6; ai++) {
menuList.add("Item" + ai);
}
arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,menuList);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//使用 id来获取当前单击的是哪个按钮 id从0开始,第一个按钮是0
//使用 drawerLayout.closeDrawer(listView)来关闭侧边栏
//
}
});
(1)drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); //关闭手势滑动
然后在需要使用的时候
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); //打开手势滑动
(2)还有一种方式不推荐采用 : 即直接移除view:
drawerLayout.remove(View);
有时候会想让物理键盘的菜单按键弹出来这个DrawerLayout,可以通过截获键盘单击事件来实现:
private boolean isDrawerLayoutPopped=false; //用这个Boolean来判断菜单是否弹出
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode)
{
case KeyEvent.KEYCODE_MENU: //如果是 菜单 按钮按下
if (!isDrawerLayoutPopped){
drawerLayout.openDrawer(listView);
isDrawerLayoutPopped=true;
} else {
drawerLayout.closeDrawer(listView);
isDrawerLayoutPopped=false;
}
return true; //如果返回的是false则表示这个事件还没有处理完成,需要其他后续的处理
} //如果返回true则代表已经处理完成,按键消息到此中断
return super.onKeyDown(keyCode, event);
}
使用ActionBarDrawerToggle类来实现ActionBar与DrawerLayout的互动,还可以加入动画效果
首先,新建一个ActionBarDrawerToggle
private ActionBarDrawerToggle actionBarDrawerToggle;
private final String OldTitle;
OldTitle=(String)getTitle(); //弹出后改变标题,回去后再改回来,这个是本来的标题
actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, ActionBar的图片资源,
R.string.drawer_open,R.string.drawer_close) //最后这两个参数,需要在工程的资源文件string.xml中加入两个字符串,
{ //作为菜单弹出的文字提示
@Override
public void onDrawerOpened(View drawerView) { //菜单弹出的事件
super.onDrawerOpened(drawerView);
getActionBar().setTitle("请选择"); //弹出后修改了标题
invalidateOptionsMenu(); // Call onPrepareOptionsMenu() 重绘菜单选项
}
@Override
public void onDrawerClosed(View drawerView) { //菜单收回的事件
super.onDrawerClosed(drawerView);
getActionBar().setTitle(OldTitle); //标题改回去
invalidateOptionsMenu(); //重绘菜单选项
}
};
drawerLayout.setDrawerListener(actionBarDrawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true); //这个函数可以开启左上角的返回按钮
getActionBar().setHomeButtonEnabled(true); //启用这个按钮
在上面我们调用invalidateOptionsMenu()的时候,系统会自动调用onPrepareOptionsMenu()这个函数
所以我们需要重写它,来让菜单弹出的时候,ActionBar上面的图标自动隐藏
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean isDrawerOpen = drawerLayout.isDrawerOpen(listView); //判断菜单是否显示
menu.findItem(R.id.图标ID).setVisible(!isDrawerOpen); //这里有多少图标都隐藏,这里只有一个
return super.onPrepareOptionsMenu(menu);
}
然后同步ActionBar和DrawerLayout
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
//需要将ActionDrawerToggle与DrawerLayout的状态同步
//将ActionBarDrawerToggle中的drawer图标,设置为ActionBar中的Home-Button的Icon
mDrawerToggle.syncState();
}
最后,根据Google开发手册的建议,添加上:
@Override
public void onConfigurationChanged(Configuration newConfig) { //这个是屏幕旋转触发的事件
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}