SlidingMenu
2016-07-14 19:16
369 查看
方法1:直接在activity中SlidingMenu构造方法,设置侧滑菜单,代码如下
方法2:通过activity继承SlidingActivity来实现侧滑菜单,代码如下:
然后细心的你就会发现,方法2少了两句 :
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
menu.setMenu(R.layout.leftmenu);
另外,下面是两个方法实现的效果对比图:
方法一:
方法二:
可以看到,方法2即使没有设置:
menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);
也会默认为“菜单栏里包括ActionBar或标题”这个效果,那么问题来了
为什么呢?
在此之前,如果在方法2中加上方法1中最后设置的两句代码:
结果是报错:
通过分析源代码我们可以找到抛出这个异常的语句在这里:
这里getParent()不为空,也就是说当你创建SlidingMenu这个对象的时候,你已经设置了SlidingMenu.SLIDING_WINDOW。
那么,解决问题的关键就要从方法2的getSlidingMenu()方法里去寻找了。
ctrl+左键getSlidingMenu()方法,可以找到:
再顺藤摸瓜找下去:
可以看到,进入了SlidingActivityHelper这个类,这个类是SlidingActivity的帮助类,里面封装了一些初始化的方法和参数,在它的onPostCreate(Bundle savedInstanceState)方法中,我们可以看到如下代码:
由此可以得知,两种模式取决于mEnableSlide的值, 查看mEnableSlide的属性可以看到:
可以看到,mEnableSlide的默认值为true,由此可以得知,默认值状态下的SlidingMenu是设置为SLIDING_WINDOW模式的,也就解决了之前所碰到的问题。
public class Acty1 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acty1); //构造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:菜单栏里不包括ActionBar或标题 * SLIDING_CONTENT:菜单栏里包括ActionBar或标题 */ menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT); //为侧滑菜单设置布局 menu.setMenu(R.layout.leftmenu); } }
方法2:通过activity继承SlidingActivity来实现侧滑菜单,代码如下:
public class Acty2 extends SlidingActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acty2); setBehindContentView(R.layout.leftmenu); // 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); } }
然后细心的你就会发现,方法2少了两句 :
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
menu.setMenu(R.layout.leftmenu);
另外,下面是两个方法实现的效果对比图:
方法一:
方法二:
可以看到,方法2即使没有设置:
menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);
也会默认为“菜单栏里包括ActionBar或标题”这个效果,那么问题来了
为什么呢?
在此之前,如果在方法2中加上方法1中最后设置的两句代码:
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT); menu.setMenu(R.layout.leftmenu);
结果是报错:
通过分析源代码我们可以找到抛出这个异常的语句在这里:
/** * 把滑动菜单添加进所有的Activity中 * * @param activity the Activity * @param slideStyle either SLIDING_CONTENT or SLIDING_WINDOW * @param actionbarOverlay whether or not the ActionBar is overlaid */ public void attachToActivity(Activity activity, int slideStyle, boolean actionbarOverlay) { if (slideStyle != SLIDING_WINDOW && slideStyle != SLIDING_CONTENT) throw new IllegalArgumentException("slideStyle must be either SLIDING_WINDOW or SLIDING_CONTENT"); if (getParent() != null) throw new IllegalStateException("This SlidingMenu appears to already be attached"); //后面的代码无关,不贴出
这里getParent()不为空,也就是说当你创建SlidingMenu这个对象的时候,你已经设置了SlidingMenu.SLIDING_WINDOW。
那么,解决问题的关键就要从方法2的getSlidingMenu()方法里去寻找了。
// configure the SlidingMenu SlidingMenu menu = getSlidingMenu();
ctrl+左键getSlidingMenu()方法,可以找到:
/* (non-Javadoc) * @see com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivityBase#getSlidingMenu() */ public SlidingMenu getSlidingMenu() { return mHelper.getSlidingMenu(); }
再顺藤摸瓜找下去:
/** * Gets the SlidingMenu associated with this activity. * * @return the SlidingMenu associated with this activity. */ public SlidingMenu getSlidingMenu() { return mSlidingMenu; }
可以看到,进入了SlidingActivityHelper这个类,这个类是SlidingActivity的帮助类,里面封装了一些初始化的方法和参数,在它的onPostCreate(Bundle savedInstanceState)方法中,我们可以看到如下代码:
mSlidingMenu.attachToActivity(mActivity, mEnableSlide ? SlidingMenu.SLIDING_WINDOW : SlidingMenu.SLIDING_CONTENT);
由此可以得知,两种模式取决于mEnableSlide的值, 查看mEnableSlide的属性可以看到:
private boolean mEnableSlide = true;
可以看到,mEnableSlide的默认值为true,由此可以得知,默认值状态下的SlidingMenu是设置为SLIDING_WINDOW模式的,也就解决了之前所碰到的问题。
相关文章推荐
- Web自动化测试相关知识点(仅限于补充)
- Linux 下的 shell 编程之 while 循环
- POJ 1987 Distance Statistics
- Linux 下的 shell 编程之 for 循环
- Android相机,YV12ToRGB24,rgbToBitmap
- NDK的Linux的环境搭建(Eclipse篇)
- 【jzoj4624】【字符串匹配】【kmp】
- Linux 下的 shell 编程之 case 多分支选择
- 单片机小学期总结
- shell脚本杂七杂八问题
- TP3.2.3 in标签用法
- Linux 下的 shell 编程之 if-else选择结构
- Not enough space svn: zlib (uncompress): buffer error: Decompression of svndiff data failed
- STL---list(列表)
- for循环打印字典
- MyEclipse 2014+maven搭建web项目
- SIFT特征提取分析
- NDK开发详解
- 0714
- WebApp开发经验