在DrawerLayout中,除了ListView以外,是否还有其他可用作滑动抽屉的控件?

34
我希望例如从屏幕左侧滑出一个LinearLayoutRelativeLayout,而不是仅有一个孤立的ListView
我尝试使用带有android:layout_gravity="start"LinearLayout,但在运行时出现了以下错误:
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>

谢谢


你在代码中是如何引用你的DrawerLayout的?可以贴一下吗? - Marco RS
2
对于遇到“android.widget.LinearLayout$LayoutParams 无法转换为 android.support.v4.widget.DrawerLayout$LayoutParams”问题的其他人:**这个问题** 直接回答了这个问题。 - Jonik
4个回答

63

如果你移动android:id="@+id/left_drawer"(或创建一个新的id)并设置gravity,这样做将起作用。

移动id(或创建新的id)是为了引用正确,这样你就可以在上面调用closeDrawer()而不是在子视图上调用。

但更重要的是,DrawerLayout需要该元素具有设置在其中的android:layout_gravity属性,就像你提到的那样。

最后,在具有所需gravity的基本视图上调用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发表的内容,但是带有更完整的解释和示例。)


12
如果有人遇到同样的错误,使用android:layout_gravity解决了我的java.lang.IllegalArgumentException: View android.widget.LinearLayout@425d0d30 is not a drawer问题。 - Guillaume
3
我也是,我改了“mDrawer.closeDrawer”的位置,并将“android:layout_gravity="start"”移到了线性布局中。 谢谢 :) - JustADev
1
@OmarBizreh 回复得很正确,又省去了我很多搜索时间! - Rat-a-tat-a-tat Ratatouille
1
一直在苦恼,但是重力起了作用!谢谢! - Standaa - Remember Monica
我曾经遭受了很多痛苦,因为我错误地将android:layout_gravity误认为是android:gravity。谢谢! - UrielUVD
完美!你得到了我的心! - Marcelo Camargo

26

是的,可以将任何视图用作抽屉布局中的滑动部分。我喜欢将FrameLayout声明为抽屉并用我的片段替换它,这样就可以正常运行。

你收到的错误可能是由于实现的Java部分中的其他原因导致的。


谢谢您的回复,但是如果我删除LinearLayout和ImageView只留下ListView,我就没有错误并且它能正常工作。因此,我会感到惊讶如果错误出现在Java代码中。 - BigDan
能否把代码和logcat贴出来?否则我无法想到可能出了什么问题。 - Sam
10
最终你是正确的,错误出在Java中。 我必须更改: mDrawerLayout.closeDrawer(mDrawerList); 为 mDrawerLayout.closeDrawer(mDrawerView); 在代码中,mDrawerView是线性布局而不是列表。 非常感谢您的帮助。 - BigDan
我遇到了一个问题,我的意思是我有一个FrameLayout和一个Fragment在里面,但是我收到了一个错误,说FrameLayout不是滑动抽屉,我是否漏掉了什么?请协助 @SamarthJain - Rat-a-tat-a-tat Ratatouille
2
哦,好的,我在下面的答案评论中找到了它,layout_gravity="start" 是我所缺少的! - Rat-a-tat-a-tat Ratatouille
显示剩余2条评论

7

确保在像isDrawerOpen, closeDrawer等方法中传递正确的对象(您称之为mDrawerLinear的LinearLayout)。这行代码解决了我的ClassCastException问题:

boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear);

2
尝试将 android:id="@+id/left_drawer" 移动到 LinearLayout 中,而不是 ListView。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接