android的侧边栏有两种实现方式,一是slidemenu,二是drawerlayout,drawerlayout没用过,所以研究了下,官方已经有demo,但是只能4.0以上的,但是可以用v7 jar支持2.1以上的,2.1以上的astionbar会出现菜单没有显示的情况,所以建议还是4.0以上的比较简单

参考:http://blog.csdn.net/xyz_lmn/article/details/12523895

http://blog.csdn.net/crazy1235/article/details/41696291

http://bbs.csdn.net/topics/390877700


Navigation Drawer是从屏幕的左侧滑出,显示应用导航的视图。官方是这样定义的:

[html] view plain copy print ?
  1. Thenavigationdrawerisapanelthatdisplaystheapp’smain
  2. navigationoptionsontheleftedgeofthescreen.Itishidden
  3. mostofthetime,butisrevealedwhentheuserswipesafinger
  4. fromtheleftedgeofthescreenor,whileatthetoplevelofthe
  5. app,theusertouchestheappiconintheactionbar.


如下图指示:

android drawerlayout_第1张图片


Navigation Drawer不同于SlidingDrawer,它不存在可以拖动的handle;它也不同于SlidingMenu,Navigation Drawer滑出时主屏幕视图不一定。Navigation Drawer是覆盖在主视图上的。

Navigation Drawer是Android团对在2013 google IO大会期间更新的Support库(V13)中新加入的重要的功能。实现现Navigation Drawer需要使用最新支持库(V13)的DrawerLayout。Navigation Drawer的设计指南请参考

Navigation Drawerdesign guide

Create a Drawer Layout


创建Navigation Drawer需要DrawerLayout作为界面根控件。在DrawerLayout里面第一个View为当前界面主内容;第二个和第三个View为Navigation Drawer内容。如果当前界面只需要一个Navigation Drawer,则第三个View可以省略。


下面的例子中DrawerLayout里面包含两个View,第一个FrameLayout中是当前界面主要内容显示区域;第二个ListView为Navigation Drawer内容。

[java] view plain copy print ?
  1. <android.support.v4.widget.DrawerLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/drawer_layout"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <!--Themaincontentview-->
  7. <FrameLayout
  8. android:id="@+id/content_frame"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"/>
  11. <!--Thenavigationdrawer-->
  12. <ListViewandroid:id="@+id/left_drawer"
  13. android:layout_width="240dp"
  14. android:layout_height="match_parent"
  15. android:layout_gravity="start"
  16. android:choiceMode="singleChoice"
  17. android:divider="@android:color/transparent"
  18. android:dividerHeight="0dp"
  19. android:background="#111"/>
  20. </android.support.v4.widget.DrawerLayout>

上面的代码中有如下几点需要注意:


    • 1、显示界面主要内容的View (上面的FrameLayout)必须为DrawerLayout的第一个子View,原因在于 XML 布局文件中的View顺序为Android系统中的 z-ordering顺序,而Navigation Drawer必须出现在内容之上。

    • 2、显示界面内容的View宽度和高度设置为和父View一样,原因在于当Navigation Drawer不可见的时候,界面内容代表整个界面UI。

    • 3、Navigation Drawer (上面的ListView)必须使用android:layout_gravity属性设置水平的 gravity值.如果要支持 right-to-left (RTL,从右向左阅读)语言 用"start"代替"left"(当在 RTL语言运行时候,菜单出现在右侧)。

    • 4、抽屉菜单的宽度为dp单位而高度和父View一样。抽屉菜单的宽度应该不超过320dp,这样用户可以在菜单打开的时候看到部分内容界面。

Initialize the Drawer List


在您的Activity中需要先初始化Navigation Drawer内容,根据您的应用需要Navigation Drawer的内容可能不是ListView,可以使用其他View。


在上面的示例中,我们需要给Navigation Drawer的ListView设置一个Adapter来提供数据。如下所示:


[java] view plain copy print ?
  1. publicclassMainActivityextendsActivity{
  2. privateString[]mPlanetTitles;
  3. privateDrawerLayoutmDrawerLayout;
  4. privateListViewmDrawerList;
  5. ...
  6. @Override
  7. publicvoidonCreate(BundlesavedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. mPlanetTitles=getResources().getStringArray(R.array.planets_array);
  11. mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
  12. mDrawerList=(ListView)findViewById(R.id.left_drawer);
  13. //Settheadapterforthelistview
  14. mDrawerList.setAdapter(newArrayAdapter<String>(this,
  15. R.layout.drawer_list_item,mPlanetTitles));
  16. //Setthelist'sclicklistener
  17. mDrawerList.setOnItemClickListener(newDrawerItemClickListener());
  18. ...
  19. }
  20. }

上面的代码调用了setOnItemClickListener()函数来接受Navigation Drawer点击事件。下面会介绍如何通过点击Navigation Drawer显示主界面内容。

Handle Navigation Click Events


当用户选择Navigation DrawerList中的条目时,系统会调用 OnItemClickListeneronItemClick()函数


根据您的应用需要,onItemClick函数的实现方式可能不同。下面的示例中,选择Navigation Drawer条目会在程序主界面中插入不同的Fragment

[java] view plain copy print ?
  1. privateclassDrawerItemClickListenerimplementsListView.OnItemClickListener{
  2. @Override
  3. publicvoidonItemClick(AdapterViewparent,Viewview,intposition,longid){
  4. selectItem(position);
  5. }
  6. }
  7. /**Swapsfragmentsinthemaincontentview*/
  8. privatevoidselectItem(intposition){
  9. //Createanewfragmentandspecifytheplanettoshowbasedonposition
  10. Fragmentfragment=newPlanetFragment();
  11. Bundleargs=newBundle();
  12. args.putInt(PlanetFragment.ARG_PLANET_NUMBER,position);
  13. fragment.setArguments(args);
  14. //Insertthefragmentbyreplacinganyexistingfragment
  15. FragmentManagerfragmentManager=getFragmentManager();
  16. fragmentManager.beginTransaction()
  17. .replace(R.id.content_frame,fragment)
  18. .commit();
  19. //Highlighttheselecteditem,updatethetitle,andclosethedrawer
  20. mDrawerList.setItemChecked(position,true);
  21. setTitle(mPlanetTitles[position]);
  22. mDrawerLayout.closeDrawer(mDrawerList);
  23. }
  24. @Override
  25. publicvoidsetTitle(CharSequencetitle){
  26. mTitle=title;
  27. getActionBar().setTitle(mTitle);
  28. }

Listen for Open and Close Events


如果需要监听菜单打开关闭事件,则需要调用DrawerLayout类的setDrawerListener()函数,参数为DrawerLayout.DrawerListener接口的实现该接口提供了菜单打开关闭等事件的回调函数,例如onDrawerOpened()onDrawerClosed().


如果您的Activity使用了action bar,则您可以使用Support库提供的ActionBarDrawerToggle类,该类实现了DrawerLayout.DrawerListener接口,并且您还可以根据需要重写相关的函数。该类实现了菜单和Action bar相关的操作。


根据在Navigation Drawer设计指南中的介绍,当菜单显示的时候您应该根据情况隐藏ActionBar上的功能菜单并且修改ActionBar的标题。下面的代码演示了如何重写ActionBarDrawerToggle类的相关函数来实现该功能。


[java] view plain copy print ?
  1. publicclassMainActivityextendsActivity{
  2. privateDrawerLayoutmDrawerLayout;
  3. privateActionBarDrawerTogglemDrawerToggle;
  4. privateCharSequencemDrawerTitle;
  5. privateCharSequencemTitle;
  6. ...
  7. @Override
  8. publicvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. ...
  12. mTitle=mDrawerTitle=getTitle();
  13. mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
  14. mDrawerToggle=newActionBarDrawerToggle(this,mDrawerLayout,
  15. R.drawable.ic_drawer,R.string.drawer_open,R.string.drawer_close){
  16. /**Calledwhenadrawerhassettledinacompletelyclosedstate.*/
  17. publicvoidonDrawerClosed(Viewview){
  18. getActionBar().setTitle(mTitle);
  19. invalidateOptionsMenu();//createscalltoonPrepareOptionsMenu()
  20. }
  21. /**Calledwhenadrawerhassettledinacompletelyopenstate.*/
  22. publicvoidonDrawerOpened(ViewdrawerView){
  23. getActionBar().setTitle(mDrawerTitle);
  24. invalidateOptionsMenu();//createscalltoonPrepareOptionsMenu()
  25. }
  26. };
  27. //SetthedrawertoggleastheDrawerListener
  28. mDrawerLayout.setDrawerListener(mDrawerToggle);
  29. }
  30. /*CalledwheneverwecallinvalidateOptionsMenu()*/
  31. @Override
  32. publicbooleanonPrepareOptionsMenu(Menumenu){
  33. //Ifthenavdrawerisopen,hideactionitemsrelatedtothecontentview
  34. booleandrawerOpen=mDrawerLayout.isDrawerOpen(mDrawerList);
  35. menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
  36. returnsuper.onPrepareOptionsMenu(menu);
  37. }
  38. }

Open and Close with the App Icon


用户可以从屏幕边缘滑动来打开Navigation Drawer,如果您使用了action bar,应该让用户通过点击应用图标也可以打开抽屉菜单。并且应用图标也应该使用一个特殊的图标来指示抽屉菜单。您可以使用ActionBarDrawerToggle类来实现这些功能。


使用ActionBarDrawerToggle,先通过其构造函数来创建该对象,构造函数需要如下参数:

    • 1)显示Navigation DrawerActivity对象
    • 2)DrawerLayout对象
    • 3)一个用来指示Navigation Drawer的 drawable资源
    • 4)一个用来描述打开Navigation Drawer的文本 (用于支持可访问性)。
    • 5)一个用来描述关闭Navigation Drawer的文本(用于支持可访问性).

无论你是否继承ActionBarDrawerToggle来实现Navigation Drawer监听器,您都需要在Activity的生命周期函数中调用ActionBarDrawerToggle的一些函数。

如下所示:


[java] view plain copy print ?
  1. publicclassMainActivityextendsActivity{
  2. privateDrawerLayoutmDrawerLayout;
  3. privateActionBarDrawerTogglemDrawerToggle;
  4. ...
  5. publicvoidonCreate(BundlesavedInstanceState){
  6. ...
  7. mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
  8. mDrawerToggle=newActionBarDrawerToggle(
  9. this,/*hostActivity*/
  10. mDrawerLayout,/*DrawerLayoutobject*/
  11. R.drawable.ic_drawer,/*navdrawericontoreplace'Up'caret*/
  12. R.string.drawer_open,/*"opendrawer"description*/
  13. R.string.drawer_close/*"closedrawer"description*/
  14. ){
  15. /**Calledwhenadrawerhassettledinacompletelyclosedstate.*/
  16. publicvoidonDrawerClosed(Viewview){
  17. getActionBar().setTitle(mTitle);
  18. }
  19. /**Calledwhenadrawerhassettledinacompletelyopenstate.*/
  20. publicvoidonDrawerOpened(ViewdrawerView){
  21. getActionBar().setTitle(mDrawerTitle);
  22. }
  23. };
  24. //SetthedrawertoggleastheDrawerListener
  25. mDrawerLayout.setDrawerListener(mDrawerToggle);
  26. getActionBar().setDisplayHomeAsUpEnabled(true);
  27. getActionBar().setHomeButtonEnabled(true);
  28. }
  29. @Override
  30. protectedvoidonPostCreate(BundlesavedInstanceState){
  31. super.onPostCreate(savedInstanceState);
  32. //SyncthetogglestateafteronRestoreInstanceStatehasoccurred.
  33. mDrawerToggle.syncState();
  34. }
  35. @Override
  36. publicvoidonConfigurationChanged(ConfigurationnewConfig){
  37. super.onConfigurationChanged(newConfig);
  38. mDrawerToggle.onConfigurationChanged(newConfig);
  39. }
  40. @Override
  41. publicbooleanonOptionsItemSelected(MenuItemitem){
  42. //PasstheeventtoActionBarDrawerToggle,ifitreturns
  43. //true,thenithashandledtheappicontouchevent
  44. if(mDrawerToggle.onOptionsItemSelected(item)){
  45. returntrue;
  46. }
  47. //Handleyourotheractionbaritems...
  48. returnsuper.onOptionsItemSelected(item);
  49. }
  50. ...
  51. }

更多相关文章

  1. 安卓开机界面修改
  2. Android设置界面切换动画的两种方式
  3. [AndroidUI]使用DrawerLayout实现侧滑菜单
  4. Android高仿网易云音乐播放界面
  5. Android 实现导航菜单左右滑动效果
  6. Android 添加菜单和返回按钮

随机推荐

  1. Vue中的计算属性与监听属性
  2. vue事件绑定、列表渲染、计算属性与侦听
  3. 提高EDA(探索性数据分析)效率的 3 个简单工
  4. Python 中的 requirements.txt 与 setup.
  5. Python图片批量自动抠图去背景
  6. Python 随机(random)模块的不可预测之美
  7. 如何构建可重复读取inputStream的request
  8. Python中的if...else语法和执行流程
  9. Java对象级别与类级别的同步锁synchroniz
  10. 老街华纳国际娱乐公司开户电话《17166918