Android 向 Navigation drawer 添加线性布局(最终因 ClassCastException 而崩溃)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21621673/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Adding a linear layout to Navigation drawer (ends up crashing with a ClassCastException)
提问by Atul O Holic
I am trying to add a vertical linear layout (having a title, image, menu title, listview and an icon at the bottom)to the navigation drawer. However the app crashes displaying
我正在尝试向导航抽屉添加垂直线性布局(具有标题、图像、菜单标题、列表视图和底部的图标)。但是应用程序崩溃显示
'java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams'
error. I am not sure if this is possible straight ways as I checked couple of links and the only close I got was this.Any help is appreciated. Thanks in advance. Here is my code.
错误。我不确定这是否可行,因为我检查了几个链接,唯一得到的结果就是这个。任何帮助表示赞赏。提前致谢。这是我的代码。
<!-- The main context view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<LinearLayout
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#fff"
android:gravity="bottom|center"
android:orientation="vertical"
android:paddingTop="30dp" >
<ListView
android:id="@+id/left_drawer"
android:choiceMode="singleChoice"
android:divider="#E8E8E8"
android:dividerHeight="1dp"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="10dp"
android:src="@drawable/footer_image" />
</LinearLayout>
Now the issue here is, xml is not allowing me to define width and height for the listview (Element is unknown) and I am also not able to run it as compiler says "You must supply a layout_width" attribute?? Please help.
现在的问题是,xml 不允许我为列表视图定义宽度和高度(元素未知),而且我也无法运行它,因为编译器说“您必须提供 layout_width”属性?请帮忙。
My code with the scrollview.
我的带有滚动视图的代码。
<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" >
<!-- The main context view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ScrollView
android:id="@+id/leftRL"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:layout_marginBottom="5dp"
android:background="#fff" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="3dp"
android:src="@drawable/ic_launcher"
android:text="Dummy"
android:textColor="#2E3192"
android:textStyle="bold" />
<View
android:layout_width="fill_parent"
android:layout_height="2dip"
android:background="#2E3192" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="2dp" >
<ImageView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:background="#e8e8e8"
android:scaleType="fitXY"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="7"
android:gravity="center"
android:orientation="vertical"
android:padding="5dp" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Dummy name"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="[email protected]"
android:textSize="10sp" />
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:paddingBottom="3dp"
android:src="@drawable/ic_launcher"
android:text="Dummy item"
android:textColor="#2E3192"
android:textStyle="bold" />
<View
android:layout_width="fill_parent"
android:layout_height="2dip"
android:background="#2E3192" />
</LinearLayout>
<ListView/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="40dp"
android:padding="10dp"
android:src="@drawable/footer_image" />
</LinearLayout>
</ScrollView>
</android.support.v4.widget.DrawerLayout>
采纳答案by Atul O Holic
I got the solution using your answers, thanks :). Actually the issue was with the list view. I was getting the linear layout on the left drawer, however it wasnt displayed properly as I added a scroll View to my linear layout and I also had a list in the same view which displayed only the first item in the list leaving the entire screen space blank. I checked few links to get the answer but it didn't work. At the end, since the list data is known to me and it will not change dynamically I added RadioButtons, customized them and replaced the list.
我使用您的答案得到了解决方案,谢谢:)。实际上问题出在列表视图上。我在左边的抽屉里得到了线性布局,但是当我在线性布局中添加了一个滚动视图时它没有正确显示,而且我在同一个视图中有一个列表,它只显示列表中的第一项,留下了整个屏幕空间空白的。我检查了几个链接以获得答案,但没有用。最后,由于我知道列表数据并且它不会动态更改,因此我添加了 RadioButtons,自定义它们并替换了列表。
My code looks like below now.
我的代码现在如下所示。
<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="@color/app_background" >
<!-- The main context view -->
<FrameLayout
android:id="@+id/fragment_holder"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ScrollView
android:id="@+id/leftDrawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#fff" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:paddingBottom="3dp"
android:src="@drawable/ic_launcher"
android:text="@string/menu_account"
android:textColor="@color/nav_headingsColor"
android:textStyle="bold" />
<View
android:layout_width="fill_parent"
android:layout_height="2dip"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@color/nav_headingsColor" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imgProfilePic"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_weight="3"
android:scaleType="fitXY"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imgProfilePic"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_weight="3"
android:clickable="true"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="7"
android:gravity="center"
android:orientation="vertical"
android:padding="5dp" >
<TextView
android:id="@+id/lblName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Christian Bale"
android:textColor="@color/nav_textColor"
android:textSize="18sp" />
<TextView
android:id="@+id/lblEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="[email protected]"
android:textColor="@color/nav_textColor"
android:textSize="10sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp"
android:paddingBottom="3dp"
android:src="@drawable/ic_launcher"
android:text="@string/menu_menu"
android:textColor="@color/nav_headingsColor"
android:textStyle="bold" />
<View
android:layout_width="fill_parent"
android:layout_height="2dip"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@color/nav_headingsColor" />
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="5dip"
android:layout_marginTop="2dip" >
<RadioButton
android:id="@+id/radioTopTen"
style="@style/RadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_launcher"
android:paddingLeft="20dp"
android:text="@string/menu_topTen" />
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/nav_itemSep" />
<RadioButton
android:id="@+id/radioWish"
style="@style/RadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_launcher"
android:paddingLeft="20dp"
android:text="@string/menu_wish" />
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/nav_itemSep" />
<RadioButton
android:id="@+id/radioGifts"
style="@style/RadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_launcher"
android:paddingLeft="20dp"
android:text="@string/menu_gifts" />
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/nav_itemSep" />
<RadioButton
android:id="@+id/radioLibrary"
style="@style/RadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_launcher"
android:paddingLeft="20dp"
android:text="@string/menu_library" />
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/nav_itemSep" />
<RadioButton
android:id="@+id/radioWhatsOn"
style="@style/RadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_launcher"
android:paddingLeft="20dp"
android:text="@string/menu_whatsOn" />
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@color/nav_itemSep" />
<RadioButton
android:id="@+id/radioDownload"
style="@style/RadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_launcher"
android:paddingLeft="20dp"
android:text="@string/menu_download" />
</RadioGroup>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="40dp"
android:padding="10dp"
android:src="@drawable/footer_image" />
</LinearLayout>
</ScrollView>
I know this might not be the best possibility but at least its working for me. If any one has a better solution, then please let me know.
我知道这可能不是最好的可能性,但至少对我有用。如果有人有更好的解决方案,请告诉我。
回答by Pranav Mahajan
Your query is difficult to understand without code & stacktrace, but anyway..
如果没有代码和堆栈跟踪,您的查询很难理解,但无论如何..
Remember android.support.v4.widget.DrawerLayout can have 3 elements only (in exactly this order):
记住 android.support.v4.widget.DrawerLayout 只能有 3 个元素(完全按照这个顺序):
Your main page
Left Drawer
Right Drawer
您的主页
左抽屉
右抽屉
Copy paste this example(only first two elements are there) & continue with your requirements
复制粘贴此示例(仅存在前两个元素)并继续满足您的要求
<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" >
<!-- Your main screen -->
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<RelativeLayout
android:id="@+id/topRL"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#DE6D53"
android:orientation="horizontal" >
<ImageButton
android:id="@+id/left_drawer_button"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:onClick="onOpenLeftDrawer"
android:src="@drawable/ic_launcher" />
</RelativeLayout>
<FrameLayout
android:id="@+id/frame_to_be_replaced"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/topRL" />
</RelativeLayout>
<!-- left drawer -->
<RelativeLayout
android:id="@+id/whatYouWantInLeftDrawer"
android:layout_width="290dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/black" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="title"
android:textColor="@android:color/white" />
<ListView
android:id="@+id/left_expandableListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start" />
<TextView
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_alignParentBottom="true"
android:textColor="@android:color/white"
android:text="bottom" />
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
Your Activity:
您的活动:
public class MainActivity extends Activity {
RelativeLayout leftRL;
RelativeLayout rightRL;
DrawerLayout drawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// I'm removing the ActionBar.
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.temp);
leftRL = (RelativeLayout)findViewById(R.id.whatYouWantInLeftDrawer);
drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
}
public void onOpenLeftDrawer(View view)
{
drawerLayout.openDrawer(leftRL);
}
}
回答by vipul mittal
do 2 things:
做两件事:
- set
gravity="START"
to linearlayout not listview as LinearLayout is now drawer. - at the time of closing the drawer call
drawer.close(Gravity.START);
don't pass listView object here.
- 设置
gravity="START"
为 linearlayout 不是 listview 因为 LinearLayout 现在是抽屉。 - 在关闭抽屉调用时
drawer.close(Gravity.START);
不要在这里传递 listView 对象。
回答by Sushil
This error is coming because of wrong import. Add a proper import for Layout params.
由于导入错误,此错误即将到来。为布局参数添加适当的导入。
This import "android.widget.LinearLayout.LayoutParams" is getting mixed with Drawerlayout library declaration of LayoutParams ie "android.support.v4.widget.DrawerLayout$LayoutParams" resulting in ClassCast excption.
此导入“ android.widget.LinearLayout.LayoutParams”与 LayoutParams 的 Drawerlayout 库声明(即“ android.support.v4.widget.DrawerLayout$LayoutParams”)混合在一起,导致 ClassCast 异常。
回答by akash89
Try doing this,
尝试这样做,
In function selectItem, change mDrawerLayout.closeDrawer(mDrawerList); to mDrawerLayout.closeDrawer(mDrawerLinear);Should work perfectly fine.
在函数 selectItem 中,更改mDrawerLayout.closeDrawer(mDrawerList);到 mDrawerLayout.closeDrawer(mDrawerLinear); 应该工作得很好。
Because, the reference should now be your linearLayout, its no longer the listview that you are closing or opening.
因为,参考现在应该是您的 linearLayout,它不再是您正在关闭或打开的列表视图。