是否可以使用除listview之外的其他内容作为drawerlayout中的滑动抽屉

时间:2013-05-24 15:30:40

标签: android drawerlayout

我希望从屏幕左侧滑动LinearLayoutRelativeLayout而不是单独的ListView

我尝试将LinearLayoutandroid:layout_gravity="start"一起使用,我在运行时遇到此错误:

ClassCastException: android.widget.LinearLayout$LayoutParams cannot 
be cast to android.support.v4.widget.DrawerLayout$LayoutParams

这是布局文件:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    >

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout 
        android:layout_width="320dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:orientation="vertical">

        <ImageView 
            android:id="@+id/ivwLogo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/video_icon"
        />

        <ListView 
            android:id="@+id/left_drawer"
            android:layout_width="320dp"
            android:layout_height="match_parent"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="@android:color/white"
        />

    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

由于

4 个答案:

答案 0 :(得分:63)

如果同时移动android:id="@+id/left_drawer"(或创建新ID)并设置重力,这将有效。

id移动(或新移动)是因为引用是正确的,因此您在其上调用closeDrawer()而不是子视图。

但最重要的是,正如您所提到的,DrawerLayout要求该元素设置android:layout_gravity

最后,您需要在基本视图上调用close closeDrawer(),即具有所需重力的视图。

示例:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white">

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout 
        android:id="@+id/left_drawer"
        android:layout_width="320dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:orientation="vertical">

        <ImageView 
            android:id="@+id/ivwLogo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/video_icon" />

        <ListView 
            android:id="@+id/left_drawer_child"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="@android:color/white" />

    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

在代码中:

DrawerLayout mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout)
LinearLayout mDrawerLinear = (LinearLayout) findViewById(R.id.left_drawer);
ListView mDrawerListChild = (ListView) findViewById(R.id.left_drawer_child);

...

mDrawer.closeDrawer(mDrawerLinear);

(这基本上是@Karakuri发布的内容,但有更完整的解释和示例。)

答案 1 :(得分:26)

是的,可以将任何视图作为抽屉布局的滑动部分。我更喜欢将FrameLayout声明为抽屉并将其替换为我的片段,并且运行得很好。

您获得的错误可能是由于您实施的Java部分中的其他原因造成的。

答案 2 :(得分:7)

确保为LinearLayout等方法传递正确的对象(isDrawerOpen, closeDrawer名为mDrawerLinear)。此行解决了我的ClassCastException

boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear);

答案 3 :(得分:2)

尝试将android:id="@+id/left_drawer"移至LinearLayout而不是ListView