从ActionBar下拉视图(菜单)

时间:2013-05-06 12:50:50

标签: android android-actionbar actionbarsherlock

我需要实现一个下拉视图,它在ActionBar的最右边部分有一个“句柄”。它应该是全宽度并在单击手柄时打开动画,此外手柄本身应该是可拖动的。 minSdkVersion是8

关于下拉功能本身,我发现SlidingDrawer不符合要求,因为它已从API v17开始弃用,并且只能从下到上打开。控件SlidingTray似乎克服了这个问题。我没有彻底测试过,但似乎按预期工作。

现在主要问题。甚至可以以这种方式显示视图吗?我试图为ActionBar设置一个自定义视图,其中膨胀的XML看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <my.package.drawer.SlidingTray
        android:id="@+id/drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:content="@+id/content"
        android:handle="@+id/handle" >

        <ImageView
            android:id="@+id/handle"
            android:layout_width="88dp"
            android:layout_height="44dp"
            android:src="@drawable/ic_launcher" />

        <Button
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </my.package.drawer.SlidingTray>
</RelativeLayout>

现在,SlidingTray视图本身在我将其放入活动/片段布局时可以正常运行(可以拖动手柄并单击它以打开/关闭托盘),但是当在ActionBar内部上面布局时,以及在按下/拖动手柄时,托盘仅在停止前移动几个像素 - 它不会超出ActionBar界限。这是主要问题 - 视图是否可以超出ActionBar本身(在下面显示的活动上),如果是 - 如何?

1 个答案:

答案 0 :(得分:1)

由于没有人回答,我会发布我是如何解决这个问题的。 在使用hierarchyviewer进行一些检查之后,我看到ActionBar位于LinearLayout中,因此,不可能在ActionBar边界之外扩展它的子节点。所以我决定获得root(装饰)视图并在那里附加SlidingDrawer的修改版本。以下是摘录:

ViewGroup decor = (ViewGroup) getWindow().getDecorView();
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View drawerContainer = inflater.inflate(R.layout.sliding_drawer, null);
drawer = (SlidingDrawer) drawerContainer.findViewById(R.id.drawer);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
decor.addView(drawerContainer, params);

由于以这种方式添加视图会将其显示在状态栏后面,我还添加了一个顶部填充为25dp的容器视图,以便在其下方显示句柄和内容。

注意:如果您使用的是SlidingMenu库,则需要在onPostCreate()中执行此操作,因为该库也会执行此操作并将您的视图放在所有其他内容之后。