34

例如,我想从屏幕左侧滑动 aLinearLayout或 a RelativeLayout,而不是 a ListView

我尝试使用 à LinearLayoutwith android: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

4 回答 4

63

如果您同时移动android:id="@+id/left_drawer"(或创建新的 id)并设置重力,这将起作用。

id move(或新的)是这样的参考是正确的,所以你调用closeDrawer()它而不是子视图。

但最重要的是,正如您所提到的,这DrawerLayout需要该元素有一个android:layout_gravity集合。

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

例子:

<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 发布的内容,但有更完整的解释和示例。)

于 2013-08-06T05:14:35.660 回答
26

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

您遇到的错误可能是由于您的实现的 Java 部分中的某些其他原因。

于 2013-05-24T15:47:07.110 回答
7

确保为诸如此类的方法传递正确的对象(您LinearLayout称为 mDrawerLinear)isDrawerOpen, closeDrawer。这条线解决了我的问题ClassCastException

boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear);
于 2014-01-08T17:33:48.493 回答
2

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

于 2013-05-24T15:43:37.457 回答