1、通过setSlidingActionBarEnabled可以设置滑动时actionBar是否跟随滑动,具体依靠attachToActivity中的case是SLIDING_WINDOW还是SLIDING_CONTENT.
2、在Hierarchy Viewer里,列代表树的深度,而每一列里行的数量则表示每一层的深度。从图上我们能注意到RelativeLayout并不是Root级别的,而是id为content的FrameLayout的一个子元素。而实际山我们调用setContentView(View v)里的View v 就是这个content视图。
方法:在manifest文件,然后修改application的主题如下:
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
这样再打开Hierarchy Viewer,我们就能看到下图:
(注意:本人选用的Android是2.2的,要是用4.1的话,并不能得到下图,中间还会多一个Id为action_menu_bar_stub的ViewStub)
这时候我们看到content FrameLayout的父元素是PhoneWindow$DecorView。
DecorView
我们知道在Android中抽象类Window定义了最上层窗口的基本外观以及基本行为,她的实例将会被加到WindowManager中,提供一些标准的UI策略,像Background,Titlebar,以及Default key processing等等,当然这些属性是可以通过WindowManager.LayoutParams定制的。
而上面提到的PhoneWindow是Window抽象类的唯一实现,即android.policy.PhoneWindow。而DecorWindow是PhoneWindow的一个私有内部类,其实就是一个FrameLayout的扩展。
private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {}
就是这个类构成了最上层应用程序视图。根据我们在Manifest中设置的Theme或者在PhoneWindow设置的Flags,来确定DecorView的Layout。所以在我们的例子中,第一张中我们有个简单的主题(在Manifest中)包含一个titlebar和contentview,于是PhoneWindow就生成了包含Title的LinearLayout,以及放置content的FrameLayout。而在第二张图中,我们去掉了titlebar主题,所以她就只生成了包含FrameLayout的DecorView了。
3、总体思路
先调用基类中oncreate(),创建rootview slidingMenu,然后调用slidingMenu的构造函数,进行初始化,添加behindview和aboveView,然后通过调用slidingMenu的attachToActivity()去判断是否需要actionBar跟随滑动,然后通过aboveView的setContent显示上层的view(会话界面)。然后在conversationList的onCreate中先通过setContentView设置了id为content的view到目前的Decorview(aboveView),接着通过setBehindContentView中的setMenu去设置slide_menu_frame为behindview.
滑动时效果主要通过aboveview中的onTouchEvent中的setCurrentItemInternal()--->smoothScrollTo()实现。