在drawerlayout中是否可以使用除listview以外的东西作为滑动抽屉?

我想有例如一个LinearLayoutRelativeLayout从屏幕左侧而不是一个单独的ListView滑动。

我尝试使用LinearLayoutandroid: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> 

谢谢

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

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

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

id移动(或新的)是这样的引用是正确的,所以你可以调用closeDrawer()而不是子视图。

但最重要的是, DrawerLayout需要该元素在其上设置一个android:layout_gravity ,正如您所提到的。

最后,您需要在基本视图上调用close 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发布的,但是有一个更完整的解释和例子。)

确保你传递正确的对象(你的LinearLayout称为mDrawerLinear)像isDrawerOpen, closeDrawer等方法。这行解决了我的ClassCastException

 boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear); 

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