Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding a linear layout to Navigation drawer (ends up crashing with a ClassCastException)

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.

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>
like image 413
Atul O Holic Avatar asked Feb 07 '14 07:02

Atul O Holic


2 Answers

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

  1. Your main page

  2. Left Drawer

  3. 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);
    }
}
like image 130
Pranav Mahajan Avatar answered Nov 04 '22 06:11

Pranav Mahajan


do 2 things:

  1. set gravity="START" to linearlayout not listview as LinearLayout is now drawer.
  2. at the time of closing the drawer call drawer.close(Gravity.START); don't pass listView object here.
like image 27
vipul mittal Avatar answered Nov 04 '22 05:11

vipul mittal