LONGMAN
LONGMAN

Reputation: 990

LinearLayout in navigation drawer

I want place TextView of bottom ListView in navigation drawer. Throws java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams

main.xml

    <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"
    >

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="0dp"
        android:paddingBottom="4dp"
    />

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:id="@+id/left_drawer"
        android:layout_gravity="start"
        >

        <ListView
            android:id="@+id/left_menu"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:choiceMode="singleChoice"
            android:dividerHeight="0.1dp"
            android:background="#111"
            android:divider="#FFF"
            />

        <TextView
            android:id="@+id/joke_text1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:lineSpacingExtra="5sp"
            android:text="AAAAAA"
            />
    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

and java code:

// Getting reference to the DrawerLayout
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerLinear = (LinearLayout) findViewById(R.id.left_drawer);

leftMenuItems = getResources().getStringArray(R.array.leftMenuItems);

mDrawerList = (ListView) findViewById(R.id.left_menu);
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

// Generate title
String[] title = new String[] { "item1", "item2", "item4", "item4" };

// Generate icon
int[] icon = new int[] { R.drawable.abc_ic_clear, R.drawable.abc_ic_clear,
        R.drawable.abc_ic_clear, R.drawable.abc_ic_clear };


MenuListAdapter adapter = new MenuListAdapter(this, title, icon);

// Setting the adapter on mDrawerList
mDrawerList.setAdapter(adapter);

// Getting reference to the ActionBarDrawerToggle
mDrawerToggle = new ActionBarDrawerToggle(
        this,
        mDrawerLayout,
        R.drawable.ic_drawer,
        R.string.drawer_open,
        R.string.drawer_close) {

    public void onDrawerOpened(View drawerView) {
        vstitle.setText("Menu");
        invalidateOptionsMenu();
    }

    public void onDrawerClosed(View view) {
        vstitle.setText("App");
        invalidateOptionsMenu();
    }


};

// Setting DrawerToggle on DrawerLayout
mDrawerLayout.setDrawerListener(mDrawerToggle);

I found some related topics, but it's not helpful for me

  1. How to put list items at the bottom of list view in Navigation Drawer like Foursquare
  2. Adding a linear layout to Navigation drawer (ends up crashing with a ClassCastException)

Upvotes: 7

Views: 7368

Answers (3)

Amarjit
Amarjit

Reputation: 4357

I try sample on my side with your provide code and did some modicatons . please check this if it might help you ..

activity_main.xml file

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="4dp"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="0dp" />

<LinearLayout
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/left_menu"
        android:layout_width="match_parent"
        android:layout_height="300dip"
        android:background="#111"
        android:choiceMode="singleChoice"
        android:divider="#FFF"
        android:dividerHeight="0.1dp" />

    <TextView
        android:id="@+id/joke_text1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:lineSpacingExtra="5sp"
        android:text="AAAAAA"
        android:textColor="@android:color/white"
        android:textSize="16sp" />
</LinearLayout>

and MainActivity.java

package com.example.navdrawer;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;

public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private LinearLayout mDrawerLinear;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerLinear = (LinearLayout) findViewById(R.id.left_drawer);

    //leftMenuItems = getResources().getStringArray(R.array.leftMenuItems);

    mDrawerList = (ListView) findViewById(R.id.left_menu);
    //mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    // set a custom shadow that overlays the main content when the drawer opens
    //mDrawerLayout.setDrawerShadow(R.drawable.ic_launcher, GravityCompat.START);

    // Generate title
    String[] title = new String[] { "item1", "item2", "item4", "item4" };

    // Generate icon
    int[] icon = new int[] { R.drawable.ic_launcher, R.drawable.ic_launcher,
            R.drawable.ic_launcher, R.drawable.ic_launcher };


    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_spinner_item, title);



    //MenuListAdapter adapter = new MenuListAdapter(this, title, icon);

    // Setting the adapter on mDrawerList
    mDrawerList.setAdapter(dataAdapter);

    // Getting reference to the ActionBarDrawerToggle
    mDrawerToggle = new ActionBarDrawerToggle(
            this,
            mDrawerLayout,
            R.drawable.ic_launcher,
            R.drawable.ic_launcher,
            R.drawable.ic_launcher) {

        @SuppressLint("NewApi")
        public void onDrawerOpened(View drawerView) {
         //   vstitle.setText("Menu");
            invalidateOptionsMenu();
        }

        @SuppressLint("NewApi")
        public void onDrawerClosed(View view) {
          //  vstitle.setText("App");
            invalidateOptionsMenu();
        }


    };

    // Setting DrawerToggle on DrawerLayout
    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

Upvotes: 2

LONGMAN
LONGMAN

Reputation: 990

Hoorray! I found problem in my code. In function selectItem need change mDrawerLayout.closeDrawer(mDrawerList); to mDrawerLayout.closeDrawer(mDrawerLinear); Now it works perfectly! Thanks to all

Upvotes: 5

Henrique
Henrique

Reputation: 5011

If you're using Eclipse, try doing a Project->Clean.

Also, remove the xmlns:android="http://schemas.android.com/apk/res/android attribute from you FrameLayout definition in the xml since it's not necessary.

Upvotes: -3

Related Questions