当前位置:   article > 正文

DrawerLayout的相关设置与操作

drawerlayout的相关设置与操作
以前学习DrawerLayout的用法

首先在你想要添加DrawerLayout的xml文件中,用


<android.support.v4.widget.DrawerLayout>

</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"
  1. android:id="@+id/Draw_Layout"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent">
  4. <LinearLayout>
  5. //主界面的一些东西
  6. </LinearLayout>
  7. //ListView与LinearLayout或者RelativeLayout是并列的
  8. <ListView //但是一定要ListView在下面
  9. android:id="@+id/List_View"
  10. android:layout_width="240dp" //这个不要超过360dp给用户留下一点空间可以看到后面的东西
  11. android:layout_height="match_parent"
  12. android:layout_gravity="start" //这个值必须要指定start是从左侧拖拽出菜单end是从右侧
  13. android:background="#ffd0e5ff" //而不推荐使用left,right
  14. android:choiceMode="singleChoice" //单选
  15. android:divider="@android:color/transparent" //背景透明
  16. android:dividerHeight="0dp"> //项间距为0
  17. </ListView>
  18. </android.support.v4.widget.DrawerLayout>


这样,就在布局文件中添加了一个DrawerLayout

接下来,在主窗口的代码文件中,向DrawerLayout中添加元素(也就是向ListView中添加元素)

  1. private DrawerLayout drawerLayout;
  2. private ListView listView;
  3. private ArrayList<String> menuList;
  4. private ArrayAdapter<String> arrayAdapter;


然后在主窗口的OnCreate函数中添加以下代码:
  1. drawerLayout= (DrawerLayout) findViewById(R.id.Draw_Layout);
  2. listView= (ListView) findViewById(R.id.List_View);
  3. menuList = new ArrayList<String>();
  4. for (int ai = 0; ai < 6; ai++) {
  5. menuList.add("Item" + ai);
  6. }
  7. arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,menuList);
  8. listView.setAdapter(arrayAdapter);


单击事件的添加,这么实现:
  1. listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  2. @Override
  3. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  4. //使用 id来获取当前单击的是哪个按钮 id从0开始,第一个按钮是0
  5. //使用 drawerLayout.closeDrawer(listView)来关闭侧边栏
  6. //
  7. }
  8. });


如果暂时不想让DrawerLayout的活动拖出,有以下几种方法:

(1)drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); //关闭手势滑动

然后在需要使用的时候
 
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); //打开手势滑动

(2)还有一种方式不推荐采用 : 即直接移除view:

drawerLayout.remove(View);

有时候会想让物理键盘的菜单按键弹出来这个DrawerLayout,可以通过截获键盘单击事件来实现:

  1. private boolean isDrawerLayoutPopped=false; //用这个Boolean来判断菜单是否弹出
  2. @Override
  3. public boolean onKeyDown(int keyCode, KeyEvent event) {
  4. switch (keyCode)
  5. {
  6. case KeyEvent.KEYCODE_MENU: //如果是 菜单 按钮按下
  7. if (!isDrawerLayoutPopped){
  8. drawerLayout.openDrawer(listView);
  9. isDrawerLayoutPopped=true;
  10. } else {
  11. drawerLayout.closeDrawer(listView);
  12. isDrawerLayoutPopped=false;
  13. }
  14. return true; //如果返回的是false则表示这个事件还没有处理完成,需要其他后续的处理
  15. } //如果返回true则代表已经处理完成,按键消息到此中断
  16. return super.onKeyDown(keyCode, event);
  17. }


上面是第一种实现方法,轻量级并且简单,但是很局限,所以正常下使用第二种方法:


使用ActionBarDrawerToggle类来实现ActionBar与DrawerLayout的互动,还可以加入动画效果

首先,新建一个ActionBarDrawerToggle

  1. private ActionBarDrawerToggle actionBarDrawerToggle;
  2. private final String OldTitle;


然后在onCreate函数中添加:

  1. OldTitle=(String)getTitle(); //弹出后改变标题,回去后再改回来,这个是本来的标题
  2. actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, ActionBar的图片资源,
  3. R.string.drawer_open,R.string.drawer_close) //最后这两个参数,需要在工程的资源文件string.xml中加入两个字符串,
  4. { //作为菜单弹出的文字提示
  5. @Override
  6. public void onDrawerOpened(View drawerView) { //菜单弹出的事件
  7. super.onDrawerOpened(drawerView);
  8. getActionBar().setTitle("请选择"); //弹出后修改了标题
  9. invalidateOptionsMenu(); // Call onPrepareOptionsMenu() 重绘菜单选项
  10. }
  11. @Override
  12. public void onDrawerClosed(View drawerView) { //菜单收回的事件
  13. super.onDrawerClosed(drawerView);
  14. getActionBar().setTitle(OldTitle); //标题改回去
  15. invalidateOptionsMenu(); //重绘菜单选项
  16. }
  17. };
  18. drawerLayout.setDrawerListener(actionBarDrawerToggle);
  19. getActionBar().setDisplayHomeAsUpEnabled(true); //这个函数可以开启左上角的返回按钮
  20. getActionBar().setHomeButtonEnabled(true); //启用这个按钮

在上面我们调用invalidateOptionsMenu()的时候,系统会自动调用onPrepareOptionsMenu()这个函数

所以我们需要重写它,来让菜单弹出的时候,ActionBar上面的图标自动隐藏

  1. @Override
  2. public boolean onPrepareOptionsMenu(Menu menu) {
  3. boolean isDrawerOpen = drawerLayout.isDrawerOpen(listView); //判断菜单是否显示
  4. menu.findItem(R.id.图标ID).setVisible(!isDrawerOpen); //这里有多少图标都隐藏,这里只有一个
  5. return super.onPrepareOptionsMenu(menu);
  6. }

然后同步ActionBar和DrawerLayout

  1. @Override
  2. protected void onPostCreate(Bundle savedInstanceState) {
  3. super.onPostCreate(savedInstanceState);
  4. //需要将ActionDrawerToggle与DrawerLayout的状态同步
  5. //将ActionBarDrawerToggle中的drawer图标,设置为ActionBar中的Home-Button的Icon
  6. mDrawerToggle.syncState();
  7. }

最后,根据Google开发手册的建议,添加上:

  1. @Override
  2. public void onConfigurationChanged(Configuration newConfig) { //这个是屏幕旋转触发的事件
  3. super.onConfigurationChanged(newConfig);
  4. mDrawerToggle.onConfigurationChanged(newConfig);
  5. }






声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/279703
推荐阅读
相关标签
  

闽ICP备14008679号