Android开发之Navigationdrawer导航抽屉功能的实现(源代码分享)

 导航抽屉(navigationdrawer)是一个从屏幕左边滑入的面板,用于显示应用的主要导航项目。用户可以通过在屏幕左边缘滑入或者触摸操作栏的应用图标打开导航抽屉。导航抽屉覆盖在内容之上,但不覆盖操作栏。当导航抽屉完全打开后,操作栏的标题需要更换为应用的名称,而不是显示当前视图的名称,并且关闭所有和当前视图相关的操作按钮。操作栏的“更多操作”菜单按钮不需要关闭,以保证用户可以随时访问“设置”和“帮助”。下面我们就来实现导航抽屉的功能。

    

 Layout布局文件代码

 

[java] view plain copy
 
  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.     <!-- The main content view -->  
  7.     <FrameLayout  
  8.         android:id="@+id/content_frame"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"   
  11.       
  12.           
  13.         />  
  14.     <!-- The navigation drawer -->  
  15.     <ListView android:id="@+id/left_drawer"  
  16.         android:layout_width="100dp"  
  17.         android:layout_height="match_parent"  
  18.         android:layout_gravity="start"  
  19.         android:choiceMode="singleChoice"  
  20.         android:dividerHeight="1dp"  
  21.        android:background="#ffffff"/>  
  22. </android.support.v4.widget.DrawerLayout>  

注意要点:

 

(1)主要视图(上述FrameLayout)必须为DrawerLayout中的第一个孩子,因为XML意味着z顺序和抽屉必须的内容。  

(2)主要内容视图必须设置为匹配父视图的宽度和高度,因为它代表整个UI导航抽屉时隐藏。  

(3)抽屉视图(上述ListView)必须指定它的水平重力与Android:layout_gravity属性。支持从右到左的语言(RTL),指定值与“开始”而不是“左”(右边的抽屉里出 现时,布局是RTL)。   

(4)抽屉视图指定宽度的dp单位和父视图的高度匹配。抽屉的宽度应不超过320 dp所以用户总是可以看到部分的主要内容。

(5)DrawerLayout必须成为布局的根节点

MainActivity的代码

 

[java] view plain copy
 
    1. package com.example.g07_navigationdrawer;  
    2.   
    3. import android.app.Activity;  
    4. import android.app.Fragment;  
    5. import android.app.FragmentManager;  
    6. import android.os.Bundle;  
    7.   
    8. import android.support.v4.app.ActionBarDrawerToggle;  
    9. import android.support.v4.widget.DrawerLayout;  
    10. import android.view.View;  
    11. import android.widget.AdapterView;  
    12. import android.widget.ArrayAdapter;  
    13. import android.widget.ListAdapter;  
    14. import android.widget.ListView;  
    15. import android.widget.Toast;  
    16.   
    17. public class MainActivity extends Activity {  
    18.     private String[] mPlanetTitles; // listView的每一个item的名字  
    19.     private DrawerLayout mDrawerLayout;  
    20.     private ListView mDrawerList;  
    21.     private ActionBarDrawerToggle mDrawerToggle; // 用来监听DrawerLayout事件  
    22.   
    23.     @Override  
    24.     public void onCreate(Bundle savedInstanceState) {  
    25.         super.onCreate(savedInstanceState);  
    26.         setContentView(R.layout.activity_main);  
    27.         mPlanetTitles = getResources().getStringArray(R.array.planets_array);  
    28.         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);  
    29.         mDrawerList = (ListView) findViewById(R.id.left_drawer);  
    30.         // 为ListView添加适配器  
    31.         mDrawerList.setAdapter((ListAdapter) new ArrayAdapter<String>(this,  
    32.                 android.R.layout.simple_list_item_1, mPlanetTitles));  
    33.         // 监听ListView的点击事件  
    34.         mDrawerList.setOnItemClickListener(new DrawerItemClickListener());  
    35.         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);  
    36.         // 监听DrawerLayout的监听事件  
    37.         mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,  
    38.                 R.drawable.ic_launcher, R.string.app_name, R.string.app_name) {  
    39.             public void onDrawerClosed(View view) {  
    40.                 super.onDrawerClosed(view);  
    41.                 Toast.makeText(MainActivity.this, "抽屉关闭了", Toast.LENGTH_SHORT)  
    42.                         .show();  
    43.             }  
    44.             public void onDrawerOpened(View drawerView) {  
    45.                 super.onDrawerOpened(drawerView);  
    46.                 Toast.makeText(MainActivity.this, "抽屉打开了", Toast.LENGTH_SHORT)  
    47.                         .show();  
    48.             }  
    49.         };  
    50.         mDrawerLayout.setDrawerListener(mDrawerToggle);  
    51.   
    52.     }  
    53.   
    54.     private class DrawerItemClickListener implements  
    55.             ListView.OnItemClickListener {  
    56.         @Override  
    57.         public void onItemClick(AdapterView<?> parent, View view, int position,  
    58.                 long id) {  
    59.             // 根据ListView的被选中的选项切换界面布局  
    60.             Fragment fragment = new Fragment();  
    61.             FragmentManager fragmentManager = getFragmentManager();  
    62.             fragmentManager.beginTransaction()  
    63.                     .replace(R.id.content_frame, fragment).commit();  
    64.             mDrawerList.setItemChecked(position, true);  
    65.             // 给操作栏设置标题  
    66.             getActionBar().setTitle(mPlanetTitles[position]);  
    67.             mDrawerLayout.closeDrawer(mDrawerList);  
    68.         }  
    69.     }  
    70. }  
posted @ 2016-12-15 19:58  天涯海角路  阅读(138)  评论(0)    收藏  举报