您的位置:首页 > 移动开发 > Android开发

SlidingMenu的使用

2015-05-01 18:28 417 查看
一、SlidingMenu的原理。
   1.原理:两个View重叠,滑动时,让上层的View移开大部分,显示出下层的View。

二、开源项目SlidingMenu的导入与配置。
  1.SlidingMenu的使用需要依赖另一个开源项目ActionBarSherlock,需要将ActionBarSherlock的lib文件导入成一个工程,SlidingMenu的lib文件导入成一个工程,然后右键->Properties->Android,点击add添加actionbarsherlock的库工程。注意:必须保持两个工程V4包的一致,导入工程时最好点击Copy
Projects to WorkSpace ,这样可以随意修改代码。
 
  2.在需要导入SlidingMenu的工程中右键->Properties->Android,点击Add添加Lib工程即可。注意:必须保证添加的lib工程所在的目录与该工程的目录在同一目录(即两个工程都在WorkSpace)中。

  3.如果需要在3.0以下的手机中使用SlidingMenu和Fragment的话, 需要将SlidingFragmentActivity继承的    FragmentActivity 改为SherlockFragmentActivity。

三、SlidingMenu的使用。
 1.SlidingMenu的常用方法。
   ①创建一个SlidingMenu的实例,并且将其作为主Activity的内容
  SlidingMenu slidingMenu =new SlidingMenu(this);   
  slidingMenu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);               
 或 SlidingMenu slidingMenu=new SlidingMenu(this,SlidingMenu.SLIDING_CONTENT);

  ②设置SlidingMenu的滑出方向。
   slidingMenu.setMode(SlidingMenu.LEFT); 
    slidingMenu.setMode(SlidingMenu.LEFT_RIGHT); 

   ③设置滑动显示SlidingMenu的可滑动的范围 。 
  [b][b]TOUCHMODE_FULLSCREEN为全屏滑动、TOUCHMODE_NONE为不可滑动、[b]TOUCHMODE_MARGIN为边缘滑动,默认边缘滑动。[/b][/b][/b] 
                              
   slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);    //在主界面滑动的范围

   slidingMenu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);  //在SlidingMenu滑动隐藏菜单的范围,该属性会使菜单项点击失效。

   ④设置SLidingMenu与主界面之间的阴影图片和阴影宽度。
   slidingMenu.setShadowDrawable(R.drawable.shadow);               //设置主界面与菜单之间的阴影图片
   slidingMenu.setShadowWidth(int pixel);                                       //设置阴影的宽度(15dp)
   slidingMenu.setShadowWidthRes(R.dimen.shadow_width);

    ⑤设置SlidingMenu显示时主界面的宽度和SlidingMenu的宽度,两者之设置一个,一般设置offset。
   slidingMenu.setBehindOffset(int pixel);                                         //设置菜单显示时主界面的宽度(60dp)
   slidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
   slidingMenu.setBehindWidth(int pixel);                                          //设置菜单的宽度
   slidingMenu.setBehindWidthRes(res);

     ⑥设置SlidingMenu显示的内容布局。
    slidingMenu.setMenu(int resid);                                                       //设置显示的界面布局
    slidingMenu.toggle();                                                                     //动态的开关SlidingMenu
    
      ⑦当需要设置左右两个菜单时,通过如下方法设置右边菜单。  

    slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);
    slidingMenu.setSecondaryShadowDrawable(R.drawable.shadowright);      //设置右边阴影图片
    slidingMenu.setSecondaryMenu(int resid);                                                   //设置右边布局文件

      ⑧当使用[b]SlidingMenu.SLIDING_CONTENT将SlidingMenu菜单Attach到Activity上,则可以直接使用findViewById()来得到SlidingMenu的布局控件。[/b]
    
  2.SlidingMenu的监听设置。
     ①监听SlidingMenu打开的监听器:
     slidingMenu.setOnOpenListener(this);          //监听打开时
     slidingMenu.setOnOpenedListener(this);      //监听打开后
    ②监听SLidingMenu关闭的监听器:
     slidingMenu.setOnCloseListener(this);           //监听关闭时
     slidingMenu.setOnCloseListener(this);           //监听关闭后
   
  四、SlidingMenu与Fragment的结合使用。
   1.Activity必须继承SlidingFragmentActivity,(如果需要在3.0以下使用SlidingMenu和Fragment,必须让SlidingFragmentActivity继承SherlockFragmentActivity)。

   2.设置主界面的布局内容setContentView(),布局文件为一个全屏的FrameLayout。

   3.设置SlidingMenu的容器布局setBehindContentView(),布局也为一个全屏FrameLayout。

   4.设置主界面默认显示的内容。
   //第一个参数为主界面布局文件中FrameLayout的ID,第二个参数为显示的Fragment
    getSupportFragmentManager().beginTransaction.replace(int resid,Fragment fragment);

   5.设置SlidingMenu容器中显示的内容。   

   //第一个参数为SlidingMenu容器布局文件中FrameLayout的ID,第二个参数为显示的Fragment
    getSupportFragmentManager().beginTransaction.replace(int resid,Fragment fragment);

   6.在该Activity中得到SlidingMenu对象。
   SlidingMenu slidingMenu =getSlidingMenu();

   7.得到对象后,就可以使用该对象的方法来设置SlidingMenu的属性。

   8.设置SlidingMenu也显示ActionBar。
   //注意必须是false
    setSlidingActionBarEnabled(false);
   
   9.设置ActionBar可点击,并出现一个箭头。
   //设置Actionbar可点击,并上出现一个箭头
   getSupportActionBar().setDisplayHomeAsUpEnabled(true);
   //ActionBar可点击
   getSupportActionBar().setHomeButtonEnabled(true);

   10.监听点击ActionBar的功能。
    ①实现该Activity的onMenuItemSelected()方法。
    ②判断被点击的Item的ID是否是android.R.id.home。
   //如果点击了ActionBar
  if(item.getItemId()==android.R.id.home){
    slidingMenu.toggle();
  }

  五、SlidingMenu和Fragment结合使用的示例代码。
    
  1.主Activity的代码:
   /**
 * SlidingMenu与Fragment的结合使用,Activity必须继承SlidingMenu中的SlidingFragmentActivity
 * 如果需要在3.0以下手机上使用ActionBar、SlidingMenu和Fragment
 * ,则SlidingMenu中的SlidingFragmentActivity必须继承SherlockFragmentActivity
 *

 */
public class MainActivity extends SlidingFragmentActivity implements CallBack {

 /**
  * SlidingMenu对象
  */
 private SlidingMenu slidingMenu;
 /**
  * 主界面显示的Fragment
  */
 private Fragment defaultFragment;
 /**
  * 唯一标识Fragment的字符串
  */
 private final static String FRAGMENT_TAG = "defaultFragment";

 /**
  * 修饰符必须改为public
  */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // 设置主Activity的布局,布局文件是一个FrameLayout,ID为fragment_content_container
  setContentView(R.layout.activity_test4);
  // 设置SlidingMenu的容器布局,布局文件是一个FrameLayout,ID为fragment_slidingmenu_container
  setBehindContentView(R.layout.fragment_slidingmenu_container);

  // 判断默认的Fragment是否已经存在
  if (defaultFragment == null) {
   // 设置默认显示的Fragment1
   defaultFragment = new Fragment1();
  } else {
   // 得到保存的Fragment对象
   defaultFragment = getSupportFragmentManager().getFragment(
     savedInstanceState, FRAGMENT_TAG);
  }
  getSupportFragmentManager().beginTransaction()
    .replace(R.id.fragment_content_container, defaultFragment)
    .commit();

  // 设置SlidingMenu的容器显示的内容
  FragmentContainer fragmentContainer = new FragmentContainer();
  getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.fragment_slidingmenu_container, fragmentContainer)
    .commit();

  // 初始化SLidingMenu
  initSlidingMenu();

  // 设置SlidingMenu有ActionBar,必须是false
  setSlidingActionBarEnabled(false);
  // 设置ActionBar可点击,并出现一个小箭头
// getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  //设置ActionBar可点击
  getSupportActionBar().setHomeButtonEnabled(true);

 }

 private void initSlidingMenu() {
  // 得到SlidingMenu对象
  slidingMenu = getSlidingMenu();
  // 设置出现方向
  // slidingMenu.setMode(SlidingMenu.LEFT);
  // 设置左右两边都有菜单
  slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);
  // 设置可滑动的范围
  slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
  // 设置该属性会使SlidingMenu的菜单项点击事件失去效果
  // slidingMenu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);
  // 设置阴影图片
  slidingMenu.setShadowDrawable(R.drawable.shadow);
  // 设置阴影宽度
  slidingMenu.setShadowWidthRes(R.dimen.shadow_width);
  // 设置主界面的宽度
  slidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);

  // 设置右边菜单布局容器,布局文件是一个FrameLayout,ID为fragment_rightmenu_container
  slidingMenu.setSecondaryMenu(R.layout.fragment_rightsliding_container);
  // 设置右边菜单的阴影图片
  slidingMenu.setSecondaryShadowDrawable(R.drawable.shadow_right);
  // 设置右边菜单容器显示的内容
  FragmentContainer rightFragmentContainer = new FragmentContainer();
  getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.fragment_rightmenu_container,
      rightFragmentContainer).commit();

  // 不用设置的属性
  // slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
  // slidingMenu.setBehindWidthRes(res);
  // slidingMenu.setMenu(res);

 }

 @Override
 public void showClickedFragment(Fragment fragment) {
  // 将被点击的Fragment当成默认的fragment
  defaultFragment = fragment;
  // 显示被点击的Item对应的fragment
  getSupportFragmentManager().beginTransaction()
    .replace(R.id.fragment_content_container, fragment).commit();
  // 智能开启和关闭SlidingMenu
  slidingMenu.toggle();

 }

 @Override
 protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  // 将当前显示的Fragment实例保存起来
  // 第一个参数Bundle对象,第二个参数为唯一标识该Fragment的tag,第三个参数为Fragment对象
  getSupportFragmentManager().putFragment(outState, FRAGMENT_TAG,
    defaultFragment);
 }
 
 @Override
 public boolean onMenuItemSelected(int featureId, MenuItem item) {
  //判断是否点击了Actionbar,ActionBar的id是android.R.id.home
  if(item.getItemId() ==android.R.id.home){
   slidingMenu.toggle();
  }
  return super.onMenuItemSelected(featureId, item);
 }
}

  2.FragmentContainer类的代码:
 界面布局文件只是一个简单的ListView。
**
 * Fragment容器,包含多个Fragment的标识
 *

 */
public class FragmentContainer extends Fragment {

 /**
  * 显示多个Fragment的LIstView
  */
 private ListView fragmentListView;
 private List<String> fragmentList;

 /**
  * 创建一个内部回调接口,主Activity必须实现
  *

  */
 public interface CallBack {

  /**
   * 显示被点击Item对应的Fragment
   *

   * @param fragment
   */
  public void showClickedFragment(Fragment fragment);
 }

 /**
  * 接口对象,用来实现Activity的引用
  */
 private CallBack callBack;

 @Override
 public void onAttach(Activity activity) {
  super.onAttach(activity);
  // 判断主Activity是否实现了CallBack内部接口
  if (activity instanceof CallBack) {
   //将Activity引用给callBack对象
   callBack = (CallBack) activity;
  } else {
   throw new IllegalStateException(
     "FragmentContainer所在的Activity必须实现FragmentContainer的CallBack内部接口类");
  }

 }

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
 }

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  View root = inflater.inflate(R.layout.fragment_container_layout,
    container, false);
  fragmentListView = (ListView) root.findViewById(R.id.fragmentListView);
  // 初始化List集合
  initList();
  // 初始化ListView
  initListView();

  return root;
 }

 /**
  * 初始化ListView
  */
 private void initListView() {
  if (fragmentList != null) {
   ArrayAdapter<String> adapter = new ArrayAdapter<String>(
     getActivity(), android.R.layout.simple_list_item_1,
     fragmentList);

   fragmentListView.setAdapter(adapter);
  }

  // 设置点击事件监听器
  fragmentListView.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> parent, View view,
     int position, long id) {
    Fragment fragment = null;
    switch (position) {
    case 0:
     fragment = new Fragment1();
     break;
    case 1:
     fragment = new Fragment2();
     break;
    case 2:
     fragment = new Fragment3();
     break;
    case 3:
     fragment = new Fragment4();
     break;
    }
   

    //调用Activity引用的方法
    callBack.showClickedFragment(fragment);
   }
  });
 }

 /**
  * 初始化List集合
  */
 private void initList() {
  fragmentList = new ArrayList<String>();
  // 添加Fragment
  fragmentList.add(Fragment1.class.getSimpleName());
  fragmentList.add(Fragment2.class.getSimpleName());
  fragmentList.add(Fragment3.class.getSimpleName());
  fragmentList.add(Fragment4.class.getSimpleName());
 }
}

  3.四个Fragment类的代码:
四个Fragment的代码和布局文件一样,都是只包含一个TextView,比较简单。
  public class Fragment1 extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  //布局文件中只包含了一个TextView,可以根据自己需要设计布局内容
  View root =inflater.inflate(R.layout.fragment1, container, false);
  return root;
 }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息