SlidingMenu的使用详解

前言-

最近自己在做一个Android的程序,需要用到一个侧滑的菜单,发现了SlidingMenu这个开源项目。简单实用,但是实战的时候遇到了许多小问题,今天来记录一下。

 

SlidingMenu的使用-

SlidingMenu是一个GitHub上面的开源类库,不是一个完整的项目,需要将它引入自己的项目,但是我没有用这种方法,所以这里先挖一个坑

我偷了一下懒,用了一个例子里面打包好了的jar包。

 

SlidingMenu常用属性和方法-

setMenu(SlidingMenu.LEFT_RIGHT);  //设置侧滑菜单的出现位置  可选值为LEFT , RIGHT , LEFT_RIGHT

setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);  //设置侧滑菜单的触摸模式TOUCHMODE_FULLSCREEN 全屏模式、TOUCHMODE_MARGIN 边缘模式、TOUCHMODE_NONE 禁止模式

setShadowWidthRes(R.dimen.shadow_width);  //设置阴影宽度

setShadowDrawable(R.drawable.shadow);  //根据资源文件ID来设置滑动菜单的阴影效果

setSecondaryShadowDrawable(R.drawable.shadow);  //设置二级菜单的阴影效果

setBehindWidth(400);  //设置SlidingMenu菜单的宽度

setBehindOffsetRes(R.dimen.slidingmenu_offset);  //SlidingMenu划出时主页面显示的剩余宽度

setBehindWidth(400);  //设置SlidingMenu菜单的宽度

setBehindScrollScale(1.0f);  //设置SlidingMenu与下方视图的移动的速度比,当为1时同时移动,取值0-1

setMenu(R.layout.right_menu_frame);  //侧滑菜单

setSecondaryMenu(R.layout.menu_frame);  //设置第二侧滑菜单

attachToActivity(this, SlidingMenu.SLIDING_CONTENT);

//把滑动菜单添加进所有的Activity中,可选值SLIDING_CONTENT , SLIDING_WINDOW

toggle();  //动态判断自动关闭或开启SlidingMenu

showMenu();  //显示SlidingMenu

showContent();  //显示内容

 

SlidingMenu监听事件-

/**
* 设置打开监听事件,当滑动菜单被打开时调用
*/
public void setOnOpenListener(OnOpenListener listener) {
mOpenListener = listener;
}

/**
* 设置关闭监听事件,当滑动菜单被关闭时调用
*/
public void setOnCloseListener(OnCloseListener listener) {
//mViewAbove.setOnCloseListener(listener);
mCloseListener = listener;
}

/**
* 设置打开监听事件,当滑动菜单被打开过之后调用
*/
public void setOnOpenedListener(OnOpenedListener listener) {
mViewAbove.setOnOpenedListener(listener);
}

/**
* 设置关闭监听事件,当滑动菜单被关闭过之后调用
*/
public void setOnClosedListener(OnClosedListener listener) {
mViewAbove.setOnClosedListener(listener);
} 

 

 

实战使用-

转自:https://blog.csdn.net/xuemengrui12/article/details/52771806

1、在Activity中通过SlidingMenu构造方法,直接设置侧滑菜单

a、获得SlidingMenu对象
b、设置触摸屏幕的模式
c、然后设置侧滑菜单的布局
 1 /**
 2  * 在Activity中通过SlidingMenu构造方法,直接设置侧滑菜单
 3  * @author Administrator
 4  *
 5  */
 6 public class MainActivity1 extends Activity {
 7    @Override
 8    protected void onCreate(Bundle savedInstanceState) {
 9       super.onCreate(savedInstanceState);
10       setContentView(R.layout.activity_main1);
11       // configure the SlidingMenu
12       SlidingMenu menu = new SlidingMenu(this);
13       menu.setMode(SlidingMenu.LEFT);
14       // 设置触摸屏幕的模式
15       menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
16       menu.setShadowWidthRes(R.dimen.shadow_width);
17       menu.setShadowDrawable(R.drawable.shadow);
18 
19       // 设置滑动菜单视图的宽度
20  menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
21       // 设置渐入渐出效果的值
22       menu.setFadeDegree(0.35f);
23       /**
24        * SLIDING_WINDOW will include the Title/ActionBar in the content
25        * section of the SlidingMenu, while SLIDING_CONTENT does not.
26        */
27       menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
28       // 为侧滑菜单设置布局
29       menu.setMenu(R.layout.left_menu);
30    }
31 }
View Code

 

2、通过继承SlidingActivity

a、继承SlidingActivity
b、然后在onCreate中setBehindContentView(R.layout.left_menu)设置侧滑菜单的布局
c、通过getSlidingMenu()得到SlidingMenu对象,然后设置样式

public class MainActivity2 extends SlidingActivity {
   @Override
   public  void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main1);

      setBehindContentView(R.layout.left_menu);
      // configure the SlidingMenu  
      SlidingMenu menu = getSlidingMenu();
      menu.setMode(SlidingMenu.LEFT);
      // 设置触摸屏幕的模式  
      menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
      menu.setShadowWidthRes(R.dimen.shadow_width);
      menu.setShadowDrawable(R.drawable.shadow);

      // 设置滑动菜单视图的宽度  
      menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
      // 设置渐入渐出效果的值  
      menu.setFadeDegree(0.35f);

   }
View Code

 

3、将SlidingMenu当作普通控件

可以把SlidingMenu作为自定义view,然后在布局中声明使用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/id_main_ly"
      android:layout_width="match_parent"
      android:layout_height="match_parent" >

      <com.jeremyfeinstein.slidingmenu.lib.SlidingMenu
      xmlns:sliding="http://schemas.android.com/apk/res-auto"
      android:id="@+id/slidingmenulayout"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="#ffffffff"
      sliding:behindOffset="0dp"
      sliding:behindScrollScale="1"
      sliding:fadeDegree="0.3"
      sliding:fadeEnabled="true"
      sliding:touchModeAbove="fullscreen"
      sliding:viewAbove="@layout/activity_content" />
      <!-- sliding:viewAbove就是主界面要显示的布局内容 -->

      </RelativeLayout>
SlidingMenu相当于一个容器,用来存放将要显示的布局,viewAbove的值即为另一个布局
看下activity_content.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent" >

      <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="主界面" />

  </LinearLayout>
View Code

 

4、继承SlidingFragmentActivity来实现侧滑菜单

上面的例子,SlidingMenu的布局中控件的事件都需要写在Activity中,这样代码就过于庞大了,通过继承SlidingFragmentActivity,我们可以使用Fragment作为侧滑菜单的布局容器。
MainActiviyt4.java如下

public class MainActivity4 extends SlidingFragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main4);
        // 初始化SlidingMenu
        initFragmentMenu();


    }

    private void initFragmentMenu() {

        Fragment leftMenuFragment = new LeftMenuFragment();
        setBehindContentView(R.layout.left_menu_frame);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.layout_left_menu_frame, leftMenuFragment)
                .commit();
        SlidingMenu menu = getSlidingMenu();
        menu.setMode(SlidingMenu.LEFT_RIGHT);
        // 设置触摸屏幕的模式
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
        menu.setShadowWidthRes(R.dimen.shadow_width);
        menu.setShadowDrawable(R.drawable.shadow);
        // 设置滑动菜单视图的宽度
        menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
        // menu.setBehindWidth()
        // 设置渐入渐出效果的值
        menu.setFadeDegree(0.35f);
        // menu.setBehindScrollScale(1.0f);
        menu.setSecondaryShadowDrawable(R.drawable.shadow);
        // 设置右边(二级)侧滑菜单
        menu.setSecondaryMenu(R.layout.right_menu_frame);
        Fragment rightMenuFragment = new RightMenuFragment();
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.layout_right_menu_frame, rightMenuFragment)
                .commit();
    }

    public void showLeftMenu(View view) {
        getSlidingMenu().showMenu();
    }

    public void showRightMenu(View view) {
        getSlidingMenu().showSecondaryMenu();
    }
}
View Code

核心代码:
Fragment leftMenuFragment = new LeftMenuFragment();
setBehindContentView(R.layout.left_menu_frame);
getSupportFragmentManager().beginTransaction()
.replace(R.id.frm_left_menu_layout, leftMenuFragment).commit();
首先给侧滑菜单通过 setBehindContentView(R.layout.left_menu_frame); 设置一个布局,此布局中只有一个FrameLayout,然后使用FragmentManager将Fragment替换掉此Fragment,这样这个 Fragment就作为我们侧滑菜单的布局了,我们的事件处理代码也可以写在Fragement中,而不是Activity中。Fragment作为我们的菜单界面,就任由自己发挥了

 

感谢大佬:爆米花9958 

原文:https://blog.csdn.net/xuemengrui12/article/details/52771806

 

posted @ 2019-04-14 23:00  YFEYI  阅读(422)  评论(0编辑  收藏  举报