Android組件——使用DrawerLayout仿網易新聞v4.4側滑菜單

 

Android組件——使用DrawerLayout仿網易新聞v4.4側滑菜單

 25450人閱讀 評論(12) 收藏 舉報
 分類:
 

目錄(?)[+]

轉載請註明出處:http://blog.csdn.net/allen315410/article/details/42914501

概述

       今天這篇博客將記錄一些關於DrawerLayout的基本用法,我想關於DrawerLayout的用法也許有不少不夠了解,這也是比較正常的事情,因爲DrawerLayout作爲Android組件是Google後來在android中添加的,在android.support.v4包下。那麼,DrawerLayout是一個怎麼的組件呢?我們知道,當我們使用Android上各類App的時候,是不是注意過App主頁上通常有一個“側滑菜單”?關於側滑菜單的實現,我在前面博客裏有一些介紹,想多些瞭解的朋友請移步:

Android自定義控件——側滑菜單

Android自定義控件——開源組件SlidingMenu的項目集成

      這裏用“網易新聞”客戶端v4.4的截圖來說明一下,這個DrawerLayout抽屜式佈局是什麼樣子的。

   

       好,大家已經看到了,網易新聞客戶端效果很明顯,當我們手指在屏幕左側向右滑動時候,就會有一個抽屜式的菜單從左邊彈出,並且是“懸浮”在主界面之上的,合理的利用了設備上有限的空間,同樣手指在屏幕右側向左滑動也會出現一個向左彈出的抽屜式菜單,用戶體驗效果還是不錯的,在DrawerLayout出現之前,我們需要做側滑菜單時,不得不自己實現一個或者使用Github上的開源的項目SlidingMenu,也許是Google也看到了SlidingMenu的強大之處,於是在Android的後期版本中添加了DrawerLayout來實現SlidingMenu同樣功能的組件,而且爲了兼容早期版本,將其添加在android,support.v4包下。

關於DrawerLayout的Training:http://developer.android.com/training/implementing-navigation/nav-drawer.html

關於DrawerLayout的API:http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html

另外,我已經翻譯過了Google的Training課程,地址是:http://blog.csdn.net/allen315410/article/details/42875231


效果預覽



創建抽屜佈局

      下面這個抽屜佈局引用的是android.support.v4.DrawerLayout,類似於LineaLayout、RelativeLayout等佈局一樣定義,在DrawerLayout內部再定義3個佈局,分別是管理主界面的FrameLayout,此佈局用來展示界面切換的Fragment,下面是ListView,用來展示菜單列表,最後是一個RelativeLayout,用來展示右邊的佈局,佈局代碼如下:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:id="@+id/drawer_layout"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <FrameLayout  
  7.         android:id="@+id/content_frame"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent" />  
  10.   
  11.     <ListView  
  12.         android:id="@+id/left_drawer"  
  13.         android:layout_width="200dp"  
  14.         android:layout_height="match_parent"  
  15.         android:layout_gravity="start"  
  16.         android:background="#111"  
  17.         android:choiceMode="singleChoice"  
  18.         android:divider="@android:color/transparent"  
  19.         android:dividerHeight="0dp" />  
  20.   
  21.     <RelativeLayout  
  22.         android:id="@+id/right_drawer"  
  23.         android:layout_width="220dp"  
  24.         android:layout_height="match_parent"  
  25.         android:layout_gravity="end"  
  26.         android:background="#111"  
  27.         android:gravity="center_horizontal" >  
  28.   
  29.         <TextView  
  30.             android:layout_width="wrap_content"  
  31.             android:layout_height="wrap_content"  
  32.             android:text="這是右邊欄"  
  33.             android:textColor="@android:color/white"  
  34.             android:textSize="24sp" />  
  35.     </RelativeLayout>  
  36.   
  37. </android.support.v4.widget.DrawerLayout>  

這個佈局文件示範了一些重要的佈局特徵.

  • 主要內容的視圖(FrameLayout)必須是DrawLayout的第一個子元素, 因爲導航抽屜是在主要內容視圖的上面.
  • 主要內容視圖設置爲匹配父視圖的寬度和高度, 因爲它代表了整個界面導航抽屜是隱藏的.
  • 抽屜視圖(ListView)必須指定其水平重力與android:layout_gravity屬性。支持從右到左(RTL)語言,指定值與 "start" 代替 "left"(所以抽屜裏出現在佈局的右側當佈局是RTL時).這裏將ListView設置爲左邊欄菜單,所以android:layout_gravity屬性設置爲“start”,將RelativeLayout設置爲右邊欄,設置android:layout_gravity屬性爲“end”.
  • 抽屜視圖指定其寬度用dp單位和高度匹配父視圖。抽屜裏的寬度不能超過320 dp, 所以用戶總是可以看到主要內容視圖的一部分。

初始化抽屜列表

       正如上述所講,因爲DrawerLayout裏包含一個ListView作爲左邊欄側滑菜單,所以我們需要首先初始化這個抽屜列表,並且爲這個列表適配上數據,數據適配器使用的是最簡單的ArrayAdapter,模擬數據被簡單的定義在res/values/strings.xml裏,如下:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <string-array name="menu_array">  
  2.        <item>Menu 1</item>  
  3.        <item>Menu 2</item>  
  4.        <item>Menu 3</item>  
  5.        <item>Menu 4</item>  
  6. </string-array>  
       在Java代碼中,首先創建一個MainActivity繼承了android.support.v4.app.FragmentActivity,因爲後續中需要進行Fragment之間的切換。

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     setContentView(R.layout.activity_main);  
  4.         ......  
  5.     // 初始化菜單列表  
  6.     mMenuTitles = getResources().getStringArray(R.array.menu_array);  
  7.     mMenuListView.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mMenuTitles));  
  8.     mMenuListView.setOnItemClickListener(new DrawerItemClickListener());  
  9.         ......  
  10. }  


處理導航點擊事件

      當用戶選擇了抽屜列表裏面的一個Item時, 系統調用onItemClickListener上的onItemClick(), 給setOnItemClickListener()你在onItemClick()方法裏面做什麼,在下面的例子中, 選擇每一個Item都會在主要內容的佈局中插入一個不同的Fragment.並且將導航列表的內容傳遞給Fragment中顯示出來,下面是部分代碼:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2.  * ListView上的Item點擊事件 
  3.  *  
  4.  */  
  5. private class DrawerItemClickListener implements ListView.OnItemClickListener {  
  6.     @Override  
  7.     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  8.         selectItem(position);  
  9.     }  
  10. }  
  11.   
  12. /** 
  13.  * 切換主視圖區域的Fragment 
  14.  *  
  15.  * @param position 
  16.  */  
  17. private void selectItem(int position) {  
  18.     // TODO Auto-generated method stub  
  19.     Fragment fragment = new ContentFragment();  
  20.     Bundle args = new Bundle();  
  21.     switch (position) {  
  22.     case 0:  
  23.         args.putString("key", mMenuTitles[position]);  
  24.         break;  
  25.     case 1:  
  26.         args.putString("key", mMenuTitles[position]);  
  27.         break;  
  28.     case 2:  
  29.         args.putString("key", mMenuTitles[position]);  
  30.         break;  
  31.     case 3:  
  32.         args.putString("key", mMenuTitles[position]);  
  33.         break;  
  34.     default:  
  35.         break;  
  36.     }  
  37.     fragment.setArguments(args); // FragmentActivity將點擊的菜單列表標題傳遞給Fragment  
  38.     FragmentManager fragmentManager = getSupportFragmentManager();  
  39.     fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();  
  40.   
  41.     // 更新選擇後的item和title,然後關閉菜單  
  42.     mMenuListView.setItemChecked(position, true);  
  43.     setTitle(mMenuTitles[position]);  
  44.     mDrawerLayout.closeDrawer(mMenuListView);  
  45. }  

開源material-menu的集成

       細心的朋友也許會發現“網易新聞”v4.4客戶端主頁左上角上有個菜單“動態”的菜單按鈕,顯示流程是這樣的,當菜單沒有打開時,顯示“三”這樣的三條橫線,當菜單打開(無論左右菜單)時,會顯示“<-”這樣的按鈕,不停的變化,這樣的效果是不是有點絢麗啊?!瞭解過Android5.0的朋友,應該會知道這種效果是使用了Android5.0新推出的Material Design設計語言做出來的效果,那麼該怎麼模仿這個效果呢?不好意思,由於偷懶,我已經在牛牛的Github中找到了這樣的效果——material-menu組件,該組件模擬出了Android5.0下的Material Design效果,注意的是該組件中使用了JackWharton的NineOldAndroids動畫效果。

material-menu主頁:https://github.com/balysv/material-menu

NineOldAndroids主頁:https://github.com/JakeWharton/NineOldAndroids

關於material-menu的使用可以參考其主頁上的Demo和說明,集成時需要下載NineOldAndroids導出jar集成到項目中。下面是我使用的部分代碼:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     setContentView(R.layout.activity_main);  
  4.         ......  
  5.     // 設置抽屜打開時,主要內容區被自定義陰影覆蓋  
  6.     mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);  
  7.     // 設置ActionBar可見,並且切換菜單和內容視圖  
  8.     getActionBar().setDisplayHomeAsUpEnabled(true);  
  9.     getActionBar().setHomeButtonEnabled(true);  
  10.   
  11.     mMaterialMenuIcon = new MaterialMenuIcon(this, Color.WHITE, Stroke.THIN);  
  12.   
  13.     mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {  
  14.   
  15.         @Override  
  16.         public void onDrawerSlide(View drawerView, float slideOffset) {  
  17.             showView = drawerView;  
  18.             if (drawerView == mMenuListView) {  
  19.                 mMaterialMenuIcon.setTransformationOffset(MaterialMenuDrawable.AnimationState.BURGER_ARROW, isDirection_left ? 2 - slideOffset : slideOffset);  
  20.             } else if (drawerView == right_drawer) {  
  21.                 mMaterialMenuIcon.setTransformationOffset(MaterialMenuDrawable.AnimationState.BURGER_ARROW, isDirection_right ? 2 - slideOffset : slideOffset);  
  22.             }  
  23.         }  
  24.   
  25.         @Override  
  26.         public void onDrawerOpened(android.view.View drawerView) {  
  27.             if (drawerView == mMenuListView) {  
  28.                 isDirection_left = true;  
  29.             } else if (drawerView == right_drawer) {  
  30.                 isDirection_right = true;  
  31.             }  
  32.         }  
  33.   
  34.         @Override  
  35.         public void onDrawerClosed(android.view.View drawerView) {  
  36.             if (drawerView == mMenuListView) {  
  37.                 isDirection_left = false;  
  38.             } else if (drawerView == right_drawer) {  
  39.                 isDirection_right = false;  
  40.                 showView = mMenuListView;  
  41.             }  
  42.         }  
  43.     });  
  44.         ......  
  45.   
  46. }  
此外,還需要關聯一下meterial-menu的狀態,需要覆蓋Activity下的onPostCreate和onSaveInstanceState方法:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2. * 根據onPostCreate回調的狀態,還原對應的icon state 
  3. */  
  4. @Override  
  5. protected void onPostCreate(Bundle savedInstanceState) {  
  6.     super.onPostCreate(savedInstanceState);  
  7.     mMaterialMenuIcon.syncState(savedInstanceState);  
  8. }  
  9.   
  10. /** 
  11. * 根據onSaveInstanceState回調的狀態,保存當前icon state 
  12. */  
  13. @Override  
  14. protected void onSaveInstanceState(Bundle outState) {  
  15.     mMaterialMenuIcon.onSaveInstanceState(outState);  
  16.     super.onSaveInstanceState(outState);  
  17. }  


添加ActionBar上的菜單按鈕

      爲了儘量模擬出“網易新聞”v4.4客戶端主頁,我也在標題欄右上角添加一個小圖標,爲了能在點擊這個小圖標的時候彈出右邊欄菜單,實現方式很簡單,關於ActionBar上添加導航的知識可以在csdn上搜到一些解釋或者上Android開發者官網查看源文檔,我這裏首先簡單的在res/menu下main.xml中這樣定義一個:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  2.   
  3.     <item  
  4.         android:id="@+id/action_personal"  
  5.         android:icon="@drawable/action_personal"  
  6.         android:orderInCategory="100"  
  7.         android:showAsAction="always"  
  8.         android:title="@string/action_personal"/>  
  9.   
  10. </menu>  
完成定義操作後,需要加載菜單佈局:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2. * 加載菜單 
  3. */  
  4. @Override  
  5. public boolean onCreateOptionsMenu(Menu menu) {  
  6.     // Inflate the menu; this adds items to the action bar if it is present.  
  7.     getMenuInflater().inflate(R.menu.main, menu);  
  8.     return true;  
  9. }  

標題欄導航點擊事件處理

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2. * 點擊ActionBar上菜單 
  3. */  
  4. @Override  
  5. public boolean onOptionsItemSelected(MenuItem item) {  
  6.     int id = item.getItemId();  
  7.     switch (id) {  
  8.     case android.R.id.home:  
  9.         if (showView == mMenuListView) {  
  10.             if (!isDirection_left) { // 左邊欄菜單關閉時,打開  
  11.                 mDrawerLayout.openDrawer(mMenuListView);  
  12.             } else {// 左邊欄菜單打開時,關閉  
  13.                 mDrawerLayout.closeDrawer(mMenuListView);  
  14.             }  
  15.         } else if (showView == right_drawer) {  
  16.             if (!isDirection_right) {// 右邊欄關閉時,打開  
  17.                 mDrawerLayout.openDrawer(right_drawer);  
  18.             } else {// 右邊欄打開時,關閉  
  19.                 mDrawerLayout.closeDrawer(right_drawer);  
  20.             }  
  21.         }  
  22.         break;  
  23.     case R.id.action_personal:  
  24.         if (!isDirection_right) {// 右邊欄關閉時,打開  
  25.             if (showView == mMenuListView) {  
  26.                 mDrawerLayout.closeDrawer(mMenuListView);  
  27.             }  
  28.             mDrawerLayout.openDrawer(right_drawer);  
  29.         } else {// 右邊欄打開時,關閉  
  30.             mDrawerLayout.closeDrawer(right_drawer);  
  31.         }  
  32.         break;  
  33.     default:  
  34.         break;  
  35.     }  
  36.     return super.onOptionsItemSelected(item);  
  37. }  
      這段的邏輯有點繞,事實上我做的是這樣的,需要保證主界面上只能最多顯示一個菜單佈局,當左邊的菜單佈局展示時,此時打開右邊菜單佈局時,需要隱藏左邊菜單佈局;同樣,如果右邊的菜單佈局已經在展示的時候,這時需要打開左邊菜單佈局,必須首先隱藏掉右邊的菜單佈局。爲了判斷當前即將顯示或者關閉的是哪個佈局,我在全局變量中定義了showView用來標記當前即將顯示或者關閉的視圖,如果showView==mMenuListView,說明左邊菜單佈局是即將被顯示或隱藏的,這時進一步判斷菜單是視圖mMenuListView的是否已經顯示的標記isDirection_left,來打開或者關閉左邊視圖菜單。
      同樣的道理,如果當前即將顯示或者隱藏的是右邊導航菜單的話,我們需要進一步判斷右邊導航是否已經顯示,從而進行相關打開或隱藏的決定。

      這裏的邏輯似乎解釋的有點亂,而且代碼是分片段貼出來的,不利於理解,需要進一步理解的話,不妨繼續看下面的部分,我已經貼出了所以的Java代碼,註釋也很詳盡,可以方便理解,實在不行,還可以點擊博客下方的下載鏈接,直接下載源碼運行一下。


全部源碼

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public class MainActivity extends FragmentActivity {  
  2.   
  3.     /** DrawerLayout */  
  4.     private DrawerLayout mDrawerLayout;  
  5.     /** 左邊欄菜單 */  
  6.     private ListView mMenuListView;  
  7.     /** 右邊欄 */  
  8.     private RelativeLayout right_drawer;  
  9.     /** 菜單列表 */  
  10.     private String[] mMenuTitles;  
  11.     /** Material Design風格 */  
  12.     private MaterialMenuIcon mMaterialMenuIcon;  
  13.     /** 菜單打開/關閉狀態 */  
  14.     private boolean isDirection_left = false;  
  15.     /** 右邊欄打開/關閉狀態 */  
  16.     private boolean isDirection_right = false;  
  17.     private View showView;  
  18.   
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.   
  24.         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);  
  25.         mMenuListView = (ListView) findViewById(R.id.left_drawer);  
  26.         right_drawer = (RelativeLayout) findViewById(R.id.right_drawer);  
  27.         this.showView = mMenuListView;  
  28.   
  29.         // 初始化菜單列表  
  30.         mMenuTitles = getResources().getStringArray(R.array.menu_array);  
  31.         mMenuListView.setAdapter(new ArrayAdapter<String>(this,  
  32.                 R.layout.drawer_list_item, mMenuTitles));  
  33.         mMenuListView.setOnItemClickListener(new DrawerItemClickListener());  
  34.   
  35.         // 設置抽屜打開時,主要內容區被自定義陰影覆蓋  
  36.         mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,  
  37.                 GravityCompat.START);  
  38.         // 設置ActionBar可見,並且切換菜單和內容視圖  
  39.         getActionBar().setDisplayHomeAsUpEnabled(true);  
  40.         getActionBar().setHomeButtonEnabled(true);  
  41.   
  42.         mMaterialMenuIcon = new MaterialMenuIcon(this, Color.WHITE, Stroke.THIN);  
  43.         mDrawerLayout.setDrawerListener(new DrawerLayoutStateListener());  
  44.   
  45.         if (savedInstanceState == null) {  
  46.             selectItem(0);  
  47.         }  
  48.   
  49.     }  
  50.   
  51.     /** 
  52.      * ListView上的Item點擊事件 
  53.      *  
  54.      */  
  55.     private class DrawerItemClickListener implements  
  56.             ListView.OnItemClickListener {  
  57.         @Override  
  58.         public void onItemClick(AdapterView<?> parent, View view, int position,  
  59.                 long id) {  
  60.             selectItem(position);  
  61.         }  
  62.     }  
  63.   
  64.     /** 
  65.      * DrawerLayout狀態變化監聽 
  66.      */  
  67.     private class DrawerLayoutStateListener extends  
  68.             DrawerLayout.SimpleDrawerListener {  
  69.         /** 
  70.          * 當導航菜單滑動的時候被執行 
  71.          */  
  72.         @Override  
  73.         public void onDrawerSlide(View drawerView, float slideOffset) {  
  74.             showView = drawerView;  
  75.             if (drawerView == mMenuListView) {// 根據isDirection_left決定執行動畫  
  76.                 mMaterialMenuIcon.setTransformationOffset(  
  77.                         MaterialMenuDrawable.AnimationState.BURGER_ARROW,  
  78.                         isDirection_left ? 2 - slideOffset : slideOffset);  
  79.             } else if (drawerView == right_drawer) {// 根據isDirection_right決定執行動畫  
  80.                 mMaterialMenuIcon.setTransformationOffset(  
  81.                         MaterialMenuDrawable.AnimationState.BURGER_ARROW,  
  82.                         isDirection_right ? 2 - slideOffset : slideOffset);  
  83.             }  
  84.         }  
  85.   
  86.         /** 
  87.          * 當導航菜單打開時執行 
  88.          */  
  89.         @Override  
  90.         public void onDrawerOpened(android.view.View drawerView) {  
  91.             if (drawerView == mMenuListView) {  
  92.                 isDirection_left = true;  
  93.             } else if (drawerView == right_drawer) {  
  94.                 isDirection_right = true;  
  95.             }  
  96.         }  
  97.   
  98.         /** 
  99.          * 當導航菜單關閉時執行 
  100.          */  
  101.         @Override  
  102.         public void onDrawerClosed(android.view.View drawerView) {  
  103.             if (drawerView == mMenuListView) {  
  104.                 isDirection_left = false;  
  105.             } else if (drawerView == right_drawer) {  
  106.                 isDirection_right = false;  
  107.                 showView = mMenuListView;  
  108.             }  
  109.         }  
  110.     }  
  111.   
  112.     /** 
  113.      * 切換主視圖區域的Fragment 
  114.      *  
  115.      * @param position 
  116.      */  
  117.     private void selectItem(int position) {  
  118.         Fragment fragment = new ContentFragment();  
  119.         Bundle args = new Bundle();  
  120.         switch (position) {  
  121.         case 0:  
  122.             args.putString("key", mMenuTitles[position]);  
  123.             break;  
  124.         case 1:  
  125.             args.putString("key", mMenuTitles[position]);  
  126.             break;  
  127.         case 2:  
  128.             args.putString("key", mMenuTitles[position]);  
  129.             break;  
  130.         case 3:  
  131.             args.putString("key", mMenuTitles[position]);  
  132.             break;  
  133.         default:  
  134.             break;  
  135.         }  
  136.         fragment.setArguments(args); // FragmentActivity將點擊的菜單列表標題傳遞給Fragment  
  137.         FragmentManager fragmentManager = getSupportFragmentManager();  
  138.         fragmentManager.beginTransaction()  
  139.                 .replace(R.id.content_frame, fragment).commit();  
  140.   
  141.         // 更新選擇後的item和title,然後關閉菜單  
  142.         mMenuListView.setItemChecked(position, true);  
  143.         setTitle(mMenuTitles[position]);  
  144.         mDrawerLayout.closeDrawer(mMenuListView);  
  145.     }  
  146.   
  147.     /** 
  148.      * 點擊ActionBar上菜單 
  149.      */  
  150.     @Override  
  151.     public boolean onOptionsItemSelected(MenuItem item) {  
  152.         int id = item.getItemId();  
  153.         switch (id) {  
  154.         case android.R.id.home:  
  155.             if (showView == mMenuListView) {  
  156.                 if (!isDirection_left) { // 左邊欄菜單關閉時,打開  
  157.                     mDrawerLayout.openDrawer(mMenuListView);  
  158.                 } else {// 左邊欄菜單打開時,關閉  
  159.                     mDrawerLayout.closeDrawer(mMenuListView);  
  160.                 }  
  161.             } else if (showView == right_drawer) {  
  162.                 if (!isDirection_right) {// 右邊欄關閉時,打開  
  163.                     mDrawerLayout.openDrawer(right_drawer);  
  164.                 } else {// 右邊欄打開時,關閉  
  165.                     mDrawerLayout.closeDrawer(right_drawer);  
  166.                 }  
  167.             }  
  168.             break;  
  169.         case R.id.action_personal:  
  170.             if (!isDirection_right) {// 右邊欄關閉時,打開  
  171.                 if (showView == mMenuListView) {  
  172.                     mDrawerLayout.closeDrawer(mMenuListView);  
  173.                 }  
  174.                 mDrawerLayout.openDrawer(right_drawer);  
  175.             } else {// 右邊欄打開時,關閉  
  176.                 mDrawerLayout.closeDrawer(right_drawer);  
  177.             }  
  178.             break;  
  179.         default:  
  180.             break;  
  181.         }  
  182.         return super.onOptionsItemSelected(item);  
  183.     }  
  184.   
  185.     /** 
  186.      * 根據onPostCreate回調的狀態,還原對應的icon state 
  187.      */  
  188.     @Override  
  189.     protected void onPostCreate(Bundle savedInstanceState) {  
  190.         super.onPostCreate(savedInstanceState);  
  191.         mMaterialMenuIcon.syncState(savedInstanceState);  
  192.     }  
  193.   
  194.     /** 
  195.      * 根據onSaveInstanceState回調的狀態,保存當前icon state 
  196.      */  
  197.     @Override  
  198.     protected void onSaveInstanceState(Bundle outState) {  
  199.         mMaterialMenuIcon.onSaveInstanceState(outState);  
  200.         super.onSaveInstanceState(outState);  
  201.     }  
  202.   
  203.     /** 
  204.      * 加載菜單 
  205.      */  
  206.     @Override  
  207.     public boolean onCreateOptionsMenu(Menu menu) {  
  208.         // Inflate the menu; this adds items to the action bar if it is present.  
  209.         getMenuInflater().inflate(R.menu.main, menu);  
  210.         return true;  
  211.     }  
  212.   
  213. }  


源碼請在這裏下載

發佈了22 篇原創文章 · 獲贊 15 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章