在drawerlayout中是否可以使用除listview以外的东西作为滑动抽屉?
我想有例如一个LinearLayout
或RelativeLayout
从屏幕左侧而不是一个单独的ListView
滑动。
我尝试使用LinearLayout
与android: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