第一步,实现layout。
它的root必须是一个DrawerLayout,这个layout定义在android.support.v4.widget下面,如果找不到就用SDK manager更新一下support lib。
然后为DrawerLayout添加两个child view,一个定义显示内容的区域,一个定义从左边划出的那个菜单。例如
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view --> //content view必须放在第一个
<ImageView
android:id="@+id/content_frame"
android:layout_width="match_parent" //因为这个View正常状态下填充屏幕,所以match parent
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp" //定义drawer划出的宽度
android:layout_height="match_parent"
android:layout_gravity="start" //为了防止阿拉伯那种从右向左的语言,不要使用left,而是使用start
android:choiceMode="singleChoice"
android:divider="@android:color/black"
android:dividerHeight="2dp"
/>
</android.support.v4.widget.DrawerLayout>
第二步,填充Drawer
Drawer实际上就是个ListView,所以和填充ListView是一样的,设置adapter即可。
第三步,在这个ListView上设置OnItemClickListener,实现里面的onItemClick方法
第四步,在DrawLayout上设置DrawerListener,并实现onDrawerOpened和onDrawerClosed方法。
如果你的activity有action bar,那可以直接设置ActionBarDrawerToggle listener
第五步,让用户可以点击action bar上的app icon打开关闭Drawer
这个除了
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
之外还需要在onOptionItemSelected中做处理
参考代码:
public class MainActivity extends Activity {
private String[] mPlanetTitles;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ImageView mImage;
private int mImageId[] = {R.drawable.t1, R.drawable.t2,R.drawable.t3,R.drawable.t4,R.drawable.t5};
private ActionBarDrawerToggle mDrawerToggle;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPlanetTitles = getResources().getStringArray(R.array.planets_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); //把整个layout取出来
mDrawerList = (ListView) findViewById(R.id.left_drawer);
mImage = (ImageView)findViewById(R.id.content_frame);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mPlanetTitles));
// Set the list's click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); //这个设置在ListView上
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.q, R.string.open, R.string.close) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
getActionBar().setTitle("close");
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle("open");
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle); //这个设置在DrawerLayout上
getActionBar().setDisplayHomeAsUpEnabled(true); //开启action bar上app icon的点击功能
getActionBar().setHomeButtonEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Pass the event to ActionBarDrawerToggle, if it returns
// true, then it has handled the app icon touch event
if (mDrawerToggle.onOptionsItemSelected(item)) { //DrawerToggle会处理对app icon的点击
return true;
}
// Handle your other action bar items...
return super.onOptionsItemSelected(item);
}
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
mImage.setImageResource(mImageId[position]);
mDrawerLayout.closeDrawer(mDrawerList); //点击Drawer中某一项后关闭Drawer
}
}
}