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

Big*_*Dan 34 android drawerlayout

我想有例如LinearLayout或者RelativeLayout从屏幕的,而不是一个孤独的左侧滑动ListView.

我试图将使用LinearLayoutandroid:layout_gravity="start"和我在运行时有此错误:

ClassCastException: android.widget.LinearLayout$LayoutParams cannot 
be cast to android.support.v4.widget.DrawerLayout$LayoutParams
Run Code Online (Sandbox Code Playgroud)

这是布局文件:

<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>
Run Code Online (Sandbox Code Playgroud)

谢谢

Jon*_*ams 63

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

id移动(或新移动)是如此引用是正确的,因此您调用closeDrawer()它而不是子视图.

但最重要的DrawerLayoutandroid: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>
Run Code Online (Sandbox Code Playgroud)

在代码中:

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);
Run Code Online (Sandbox Code Playgroud)

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

  • 有'android:layout_gravity`解决了我的`java.lang.IllegalArgumentException:查看android.widget.LinearLayout@425d0d30不是抽屉`错误,万一有人有同样的错误... (12认同)
  • 同样在这里,我更改了"mDrawer.closeDrawer"并将"android:layout_gravity ="start""移动到线性布局.谢谢 :) (3认同)

小智 26

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

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

  • 最后你是严格的,错误是在java中.我不得不改变:mDrawerLayout.closeDrawer(mDrawerList); for mDrawerLayout.closeDrawer(mDrawerView); 在代码中,mDrawerView是线性输出而不是列表.非常感谢您的帮助 (10认同)
  • 哦,好吧,我在下面的答案的评论中得到它,layout_gravity ="start"是我错过的! (2认同)

Rom*_*man 7

确保LinearLayout为类似的方法传递正确的对象(你的mDrawerLinear)isDrawerOpen, closeDrawer.这一行解决了我ClassCastException:

boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear);
Run Code Online (Sandbox Code Playgroud)