最近在钻研各种android控件方面的知识,感觉挺有意思的。
今天在学SlidingMenu的时候碰到了一个小问题,在此记下。
首先这里有两种方式来使用SlidingMenu(当然还有其他各种方法但是问题出在这两张方法的对比上~)
方法1:直接在activity中SlidingMenu构造方法,设置侧滑菜单,代码如下
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模式的,也就解决了之前所碰到的问题。
好吧说了这么多感觉这个问题也不算什么问题- -希望看过的大神们轻喷。。。
回头想想其实自己只要多看看源码就能轻松解决了,所以以后在使用控件的时候还是应该先分析清楚源码再使用,就不会耽误自己的时间辣~