在需要抽屉菜单的界面,用DrawerLayout
作为界面根控件。在DrawerLayout里面第一个View为当前界面主内容;第二个和第三个View为抽屉菜单内容。如果当前界面只需要一个抽屉菜单,则第三个View可以省略。
下面的例子中DrawerLayout里面包含两个View,第一个FrameLayout中是当前界面主要内容显示区域;第二个ListView为抽屉菜单内容。
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <FrameLayout android:id="@+id/frame_layout" android:layout_width="match_parent" android:layout_height="match_parent" ></FrameLayout> <ListView android:id="@+id/listview" android:layout_width="240dp" android:layout_height="match_parent" android:background="#FFFFFF" android:choiceMode="singleChoice" android:layout_gravity="start" /> </android.support.v4.widget.DrawerLayout>
上面的代码中有如下几点需要注意:
FrameLayout
) 必须为DrawerLayout的第一个子View, 原因在于 XML 布局文件中的View顺序为Android系统中的 z-ordering顺序,而抽屉必须出现在内容之上。ListView
) 必须使用android:layout_gravity属性设置水平的 gravity值 .如果要支持 right-to-left (RTL,从右向左阅读)语言 用 "start"
代替 "left"
(当用"end"的时候菜单栏在右侧。但在右侧的时候总是自动滑回去,一直没搞懂,希望知道的朋友告诉我一下)。dp
单位而高度和父View一样。抽屉菜单的宽度应该不超过320dp,这样用户可以在菜单打开的时候看到部分内容界面。在您的Activity中需要先初始化抽屉菜单内容,根据您的应用需要抽屉菜单的内容可能不是ListView。官方示例中普通listView加载固定数据的过程就不多说了,和平时一样,没有干货。
如果需要监听菜单打开关闭事件,则需要调用 DrawerLayout类的
setDrawerListener()
函数,参数为 DrawerLayout.DrawerListener接口的实现。
该接口提供了菜单打开关闭等事件的回调函数,例如 onDrawerOpened()
和onDrawerClosed()
.
如果您的Activity使用了 action bar,则您可以使用Support库提供的 ActionBarDrawerToggle
类,该类实现了 DrawerLayout.DrawerListener接口,并且您还可以根据需要重写相关的函数。该类实现了菜单和Action bar相关的操作。
根据在 Navigation Drawer 设计指南中的介绍,当菜单显示的时候您应该根据情况隐藏ActionBar上的功能菜单并且修改ActionBar的标题。
关键代码:package com.tao.drawerlayout; import android.os.Bundle; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends FragmentActivity { ListView myListview; DrawerLayout drawerLayout; List<String> list; CharSequence title; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myListview = (ListView)findViewById(R.id.listview); drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); list = new ArrayList<String>(); for (int i = 0;i<10;i++){ list.add("item"+(i+1)); } ListAdapter listAdapter = new ListAdapter(this,list); myListview.setAdapter(listAdapter); drawerLayout.setDrawerListener(new ActionBarDrawerToggle(this,drawerLayout,R.drawable.ic_launcher,R.string.open,R.string.close){ @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); invalidateOptionsMenu(); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); getActionBar().setTitle(title); invalidateOptionsMenu(); } }); myListview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { MyFragment myFragment = new MyFragment(); Bundle bundle = new Bundle(); bundle.putString("content",list.get(i)); myFragment.setArguments(bundle); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.frame_layout,myFragment).commit(); title = list.get(i); myListview.setItemChecked(i,true); drawerLayout.closeDrawer(myListview); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }本文参考了 云在千峰的文章。如果需要代码可以给我留言