前言-
最近自己在做一个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构造方法,直接设置侧滑菜单
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 }
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); }
3、将SlidingMenu当作普通控件
<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" /> 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>
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(); } }
核心代码:
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