在做谷歌电子市场的时候用的是DrawerLayout实现的抽屉效果,在新闻客户端的时候用的是开源框架SlidingMenu来实现的,总的来说,各有个的优点,侧滑(开源框架)实现的效果更好,但是DrawerLayout直接写布局文件就好了,不过我还是比较喜欢用开源框架的这个。下面分别来说说如何实现:
1、SlidingMenu
首先要引入SlidingMenu的库文件的类库,不能直接导入jar包。然后 Activity继承SlidingFragmentActivity。其次,将onCreate方法改为public。
在主界面中添加如下代码:
//调用api setBehindContentView(R.layout.left_menu);// 设置侧边栏布局 SlidingMenu slidingMenu = getSlidingMenu();// 获取侧边栏对象 slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);// 设置全屏触摸 slidingMenu.setSecondaryMenu(R.layout.right_menu);// 设置右侧边栏 slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);// 设置展现模式 slidingMenu.setBehindOffset(100);// 设置预留屏幕的宽度
在BasePager.java中添加如下代码。
/** * 切换SlidingMenu的状态 * * @param b */ protected void toggleSlidingMenu() { MainActivity mainUi = (MainActivity) mActivity; SlidingMenu slidingMenu = mainUi.getSlidingMenu(); slidingMenu.toggle();// 切换状态, 显示时隐藏, 隐藏时显示 } /** * 初始化数据 */ public void initData() { } /** * 设置侧边栏开启或关闭 * * @param enable */ public void setSlidingMenuEnable(boolean enable) { MainActivity mainUi = (MainActivity) mActivity; SlidingMenu slidingMenu = mainUi.getSlidingMenu(); if (enable) { slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); } else { slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); } }每个子界面都可以用到如下的代码:
public class SettingPager extends BasePager { public SettingPager(Activity activity) { super(activity); } @Override public void initData() { //System.out.println("初始化设置数据...."); tvTitle.setText("设置"); btnMenu.setVisibility(View.GONE);// 隐藏菜单按钮 setSlidingMenuEnable(false);// 关闭侧边栏 TextView text = new TextView(mActivity); text.setText("设置"); text.setTextColor(Color.RED); text.setTextSize(25); text.setGravity(Gravity.CENTER); // 向FrameLayout中动态添加布局 flContent.addView(text); } }
二、DrawerLayout
直接在布局文件中这样写:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:id="@+id/dl"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg_tab" android:layout_gravity="left"> </FrameLayout> </android.support.v4.widget.DrawerLayout>然后再主页面中添加:
控制抽屉的开关, 显示在actionBar 上面
public class MainActivity extends BaseActivity implements OnQueryTextListener { private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle drawerToggle; private ViewPager mViewPager; private PagerTabStrip pager_tab_strip; private String[] tab_names; // 标签的名字 @Override protected void initActionBar() { ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); /* * 1)显示Navigation Drawer的 Activity 对象 2) DrawerLayout 对象 3)一个用来指示Navigation Drawer的 drawable资源 4)一个用来描述打开Navigation Drawer的文本 (用于支持可访问性)。 5)一个用来描述关闭Navigation Drawer的文本(用于支持可访问性). */ drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer_am, R.string.open_drawer, R.string.close_drawer){ @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); Toast.makeText(getApplicationContext(), "抽屉关闭了", 0).show(); } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); Toast.makeText(getApplicationContext(), "抽屉打开了", 0).show(); } }; mDrawerLayout.setDrawerListener(drawerToggle); // 让开关和actionbar建立关系 drawerToggle.syncState(); } }