Is it possible to use something other than a listview as sliding drawer in drawerlayout

跟風遠走 提交于 2019-11-27 10:00:06

问题


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


回答1:


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.




回答2:


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.)




回答3:


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);



回答4:


Try moving android:id="@+id/left_drawer" to the LinearLayout instead of the ListView



来源:https://stackoverflow.com/questions/16738595/is-it-possible-to-use-something-other-than-a-listview-as-sliding-drawer-in-drawe

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!