前言-

最近自己在做一个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、然后设置侧滑菜单的布局
 /**
* 在Activity中通过SlidingMenu构造方法,直接设置侧滑菜单
* @author Administrator
*
*/
public class MainActivity1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
// configure the SlidingMenu
SlidingMenu menu = new SlidingMenu(this);
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);
/**
* SLIDING_WINDOW will include the Title/ActionBar in the content
* section of the SlidingMenu, while SLIDING_CONTENT does not.
*/
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
// 为侧滑菜单设置布局
menu.setMenu(R.layout.left_menu);
}
}

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当作普通控件

可以把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>

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

SlidingMenu的使用详解的更多相关文章

  1. 无需SherlockActionbar的SlidingMenu使用详解(一)——通过SlidingMenu设置容器并解决滑动卡顿的问题

    想必很多人都听过这个开源框架,一年前真的是风靡一时.只是它的配置较为繁琐,还需要sherlockActionbar的支持,我这里下载了最新的开源库,并且在实际用套用了AppCompat的官方库,这样就 ...

  2. 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析

    第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...

  3. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  4. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  5. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  6. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  7. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  8. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  9. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

随机推荐

  1. 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南-C++

    目录 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 流程设计 xml信息有哪几种读取形式(xml文件或wchar) 如何选取节点,and取节点属性有哪些方法? IXMLDOMNode与I ...

  2. 【Python3爬虫】常见反爬虫措施及解决办法(三)

    上一篇博客的末尾说到全网代理IP的端口号是经过加密混淆的,而这一篇博客就将告诉你如何破解!如果觉得有用的话,不妨点个推荐哦~ 一.全网代理IP的JS混淆 首先进入全网代理IP,打开开发者工具,点击查看 ...

  3. numpy C语言源代码调试(一)

    近期学习numpy,希望了解numpy内部实现机制,尝试调试numpy的源代码,特别是其中的C语言源码. 在numpy的官方网站上,有numpy的开发人员手册: https://docs.scipy. ...

  4. 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术 ...

  5. .netcore2.1 使用postgresql数据库,不能实现表的CRUD问题

    PostgreSQL对表名.字段名都是区分大小写的.为了兼容其他的数据库程序代码的编写,推荐使用小写加_的方式,例如:swagger_info 我们使用.netcore连接postgresql数据库时 ...

  6. 【学习笔记Part 2● MySQL】

    数据库 为什么要用数据库 如何去存放数据?生活中有各种各样的数据.比如说人的姓名.年龄.成绩等.平时我们记录这些信息都是记在大脑中.人的记忆力有限,不可能什么都记住.所以后来人们把数据记录在石头上–& ...

  7. go.js remove 特定part

    我想删除一个实际上是背景的部分. 假设这是我添加part的方式 myDiagram.add( scope.gj(go.Part,//此Part未绑定到任何模型数据 { layerName:“Backg ...

  8. No Transport ,Network中看不到ajax请求

    今天在调试一个后台的接口的时候,突然发现在network中找不到我发送的请求,也就是说,ajax没有在浏览器的network中没有显示.....第一次遇见这样的情况,很苦恼,然后使用ajax中的err ...

  9. 003-005:Java平台相关的面试题

    本文首发于公众号:javaadu 003:字节码是什么? 在Java中,字节码存放于以.class结尾的二进制文件. 字节码之于Java,类似于汇编语言之于C/C++.对于C/C++语言来说,不同的平 ...

  10. MongoDb 集群不可用后SECONDARY节点强制启动

    机房意外断电断网不得不预防,下面模拟测试某机房断电断网,B机房断电断网后A机房可正常提供服务,A机房断电断网后可能需要强制重启继续提供服务了,目前查看数据都还在,暂时没验证是否有数据丢失,小试了一把. ...