我希望从屏幕左侧滑动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>
由于
答案 0 :(得分:63)
如果同时移动android:id="@+id/left_drawer"
(或创建新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发布的内容,但有更完整的解释和示例。)
答案 1 :(得分:26)
是的,可以将任何视图作为抽屉布局的滑动部分。我更喜欢将FrameLayout声明为抽屉并将其替换为我的片段,并且运行得很好。
您获得的错误可能是由于您实施的Java部分中的其他原因造成的。
答案 2 :(得分:7)
确保为LinearLayout
等方法传递正确的对象(isDrawerOpen, closeDrawer
名为mDrawerLinear)。此行解决了我的ClassCastException
:
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear);
答案 3 :(得分:2)
尝试将android:id="@+id/left_drawer"
移至LinearLayout而不是ListView