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构造方法,直接设置侧滑菜单
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当作普通控件
<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的使用详解的更多相关文章
- 无需SherlockActionbar的SlidingMenu使用详解(一)——通过SlidingMenu设置容器并解决滑动卡顿的问题
想必很多人都听过这个开源框架,一年前真的是风靡一时.只是它的配置较为繁琐,还需要sherlockActionbar的支持,我这里下载了最新的开源库,并且在实际用套用了AppCompat的官方库,这样就 ...
- 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析
第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
随机推荐
- 微服务(入门三):netcore ocelot api网关结合consul服务发现
简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...
- 看看redis中那些好玩的module (sql on redis, bf/cf on redis)
自从redis加入了module功能之后,redis的生态就很有意思了,每个领域的大佬都会以插件的形式给redis扩展一些新的功能,比如本篇说到的rediSQL,rebloom. 一:rediSQL ...
- Java线程状态间的互相转换
ava中线程的状态分为6种. 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法. 2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running) ...
- .net相关知识
1.简述 private. protected. public. internal 修饰符的访问权限. private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该 ...
- JavaSE:关键字(全)
访问控制: private 访问控制方式:私有的 protected 访问控制方式:受保护的 public 访问控制方式:公共的 类.方法和变量修饰符: abstract 声明抽象,表明类或者成员方法 ...
- 一、Java 23 种设计模式简介
一.23种设计模式分类: 二.设计模式的六大原则: 1.开闭原则(Open Close Principle):对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效 ...
- 如何只在IE上加载CSS样式表
前言:IE一直是特殊的一个浏览器,我们可以使用一些方法来指定样式表只在IE浏览器下被加载. IE9以及低于IE9版本 : 可以使用条件注释语句来加载特定于ie的样式表.如下所示,使用外部css3样式表 ...
- C#中关于表达式与委托在EF中的不同表现总结
Func<Invoice, bool> func = x => x.State == InvoiceState.Created; Expression<Func<Invo ...
- 快速构建H5单页面切换应用
在Web App和Hybrid App横行的时代,为了拥有更好的用户体验,单页面应用顺势而生,单页面应用简称`SPA`,即Single Page Application,就是只有一个HTML页面的应用 ...
- cglib根据数据动态生成对象
最近有个任务:根据查询SQL直接导出报表 实现关键是,怎么根据sql查询的数据动态生成对象列表,想到Cglib动态代理实现 废话少说,上代码: 定义动态生成Java Bean类: import jav ...