Reputation: 527
I would like to have for example a LinearLayout
or a RelativeLayout
sliding from the left of the screen instead of a lone ListView
.
I tried to use à LinearLayout
with android:layout_gravity="start"
and i had this error at runtime:
ClassCastException: android.widget.LinearLayout$LayoutParams cannot
be cast to android.support.v4.widget.DrawerLayout$LayoutParams
here's the layout file:
<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>
Thanks
Upvotes: 34
Views: 24013
Reputation: 860
Make sure you pass correct object (your LinearLayout
called mDrawerLinear) for methods like isDrawerOpen, closeDrawer
etc. This line solved my ClassCastException
:
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear);
Upvotes: 7
Reputation: 25137
This will work if you move both the android:id="@+id/left_drawer"
(or create a new id) and set the gravity.
The id move (or new one) is so the reference is correct so you call closeDrawer()
on it and not the child views.
But most importantly, the DrawerLayout
requires that element to have a android:layout_gravity
set on it, as you mentioned.
Finally, you need to call close closeDrawer()
on the base view, the one with the required gravity.
Example:
<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>
In code:
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);
(This is basically what @Karakuri posted, but with a more complete explanation and example.)
Upvotes: 63
Reputation: 3413
Yes it is possible to have any view as the sliding part of a drawer layout. I prefer declaring a FrameLayout as the drawer and replacing it with my fragment, and it runs just fine.
The error you are getting is probably due to some other reason in the Java part of your implementation.
Upvotes: 26
Reputation: 38605
Try moving android:id="@+id/left_drawer"
to the LinearLayout instead of the ListView
Upvotes: 2