ClassCastException android.widget.FrameLayout$LayoutParams to android.support.v4.widget.DrawerLayout$LayoutParams

I’m working on the Navigation Drawer for Android.
As per my requirement I was to display gridview and listview of items in the navigation drawer. I have created a linearLayout in the layout xml file and placed the two widgets(Grid view, and Listview) in the LinearLayout.

When I run the file I’m getting the following error:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.navigationdrawer3/com.example.navigationdrawer3.MainActivity}: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams

Below are my java, logcat, and NavigationDrawer layout files:

MainActivity.java

public class MainActivity extends Activity {

     private DrawerLayout mDrawerLayout;
        private ListView mDrawerList;
        private ActionBarDrawerToggle mDrawerToggle;

        private CharSequence mDrawerTitle;
        //@SuppressWarnings("unused")
        private CharSequence mTitle;
        private String[] mGalaxyTitles;

        private GridView mDrawerGrid;

        private LinearLayout mDrawerLinear;

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

        mTitle = mDrawerTitle = getTitle();
        mGalaxyTitles = getResources().getStringArray(R.array.items_array);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        mDrawerGrid = (GridView)findViewById(R.id.gridview);

        mDrawerLinear =(LinearLayout)findViewById(R.id.linearLayout);

        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        mDrawerGrid.setAdapter(new ImageAdapter(MainActivity.this));

        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, mGalaxyTitles));

        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);      

        mDrawerToggle = new ActionBarDrawerToggle(
                this,                  
                mDrawerLayout,         
                R.drawable.ic_drawer,  
                R.string.drawer_open,  
                R.string.drawer_close  
                ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); 
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); 
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            selectItem(0);
        }

    }

    class DrawerItemClickListener implements ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub

switch(position){

            case 0:
               menu0(); 
                return;
            case 1:
               menu1(); 
                return;
            case 2:
                menu2(); 
                 return;
            case 3:
               menu3(); 
                return;
            case 4:
               menu4(); 
                return;
            case 5:
               menu5(); 
                return;
            case 6:
               menu6(); 
                return;
            case 7:
               menu7(); 
                return;
            case 8:
               menu8(); 
                return;
        }

        }


        protected void menu0() {
            Intent Main0 = new Intent(MainActivity.this, Page0.class);
            startActivity(Main0);
               return;
        }

        protected void menu1() {
            Intent Main1 = new Intent(MainActivity.this, Page1.class);
            startActivity(Main1);
               return;
        }

        protected void menu2() {
              Intent Main2 = new Intent(MainActivity.this, Page2.class);
              startActivity(Main2);
           return;
    }
        protected void menu3() {
            Intent Main3 = new Intent(MainActivity.this, Page3.class);
            startActivity(Main3);
               return;
        }

        protected void menu4() {
            Intent Main4 = new Intent(MainActivity.this, Page4.class);
            startActivity(Main4);
               return;
        }

        protected void menu5() {
            Intent Main5 = new Intent(MainActivity.this, Page5.class);
            startActivity(Main5);
               return;
        }

        protected void menu6() {
            Intent Main6 = new Intent(MainActivity.this, Page6.class);
            startActivity(Main6);
               return;
        }

        protected void menu7() {
            Intent Main7 = new Intent(MainActivity.this, Page7.class);
            startActivity(Main7);
               return;
        }

        protected void menu8() {
            Intent Main8 = new Intent(MainActivity.this, Page8.class);
            startActivity(Main8);
               return;
        }

    }

    @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;
    }


     @Override
        public void setTitle(CharSequence title) {
            mTitle = title;
            getActionBar().setTitle(mDrawerTitle);
        }

       @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
           //boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
           //boolean drawerOpen2 = mDrawerLayout.isDrawerOpen(mDrawerGrid);
           boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLayout);
            menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
            //menu.findItem(R.id.action_settings).setVisible(!drawerOpen2);
            return super.onPrepareOptionsMenu(menu);
        }

       @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            if (mDrawerToggle.onOptionsItemSelected(item)) {
                return true;
            }

            switch(item.getItemId()) {
            case R.id.action_settings:
                setting();

                return true;

            case R.id.about:
                about();

                return true;
            default:
                return super.onOptionsItemSelected(item);
            }
        }

     private void about() {
        // TODO Auto-generated method stub

         Intent Main1 = new Intent(MainActivity.this, About.class);
            startActivity(Main1);
               return;

    }


    private void setting() {
        // TODO Auto-generated method stub
        Intent Main1 = new Intent(MainActivity.this, Setting.class);
        startActivity(Main1);
           return;

    }


    private void selectItem(int position) {


            Fragment fragment = new GalaxyFragment();
            Bundle args = new Bundle();
            args.putInt(GalaxyFragment.ARG_GALAXY_NUMBER, position);
            fragment.setArguments(args);

            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();


            mDrawerList.setItemChecked(position, true);
            setTitle(mGalaxyTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerLayout);
            //mDrawerLayout.closeDrawer(mDrawerGrid);
        }

     class GalaxyFragment extends Fragment{

        public static final String ARG_GALAXY_NUMBER = "galaxy_number";

         public GalaxyFragment() {

            }

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.about, container, false);           

                return rootView;
            }

     }


     //Gridview BaseAdapter class

     class ImageAdapter extends BaseAdapter{
            Context context;

        ImageAdapter(Context context){
                this.context = context;
            }


            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return mThumbIds.length;
            }

            @Override
            public Object getItem(int arg0) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public long getItemId(int arg0) {
                // TODO Auto-generated method stub
                return 0;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                ImageView imageView;

                if(convertView == null){
                    imageView = new ImageView(context);
                     imageView.setLayoutParams(new GridView.LayoutParams(25, 25));
                     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                     imageView.setPadding(8, 8, 8, 8);
                }else {
                    imageView = (ImageView) convertView;
                }
                imageView.setImageResource(mThumbIds[position]);
                return imageView;
            }

             // references to our images
            private Integer[] mThumbIds = {
                    R.drawable.sample_2, R.drawable.sample_3,
                    R.drawable.sample_4, R.drawable.sample_5,
            };

        }

}

activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" 
    android:id="@+id/drawer_layout">

     <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>

      <LinearLayout
         android:id="@+id/linearLayout"
         android:layout_width="320dp"
         android:layout_height="match_parent"
         android:orientation="vertical" 
         android:layout_gravity="left"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111">        


    <GridView 
        android:id="@+id/gridview"
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:stretchMode="columnWidth"
        android:numColumns="auto_fit"/>
       <!--  android:gravity="center"   --> 
    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        />

   </LinearLayout>     

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

logcat

07-30 06:15:57.203: W/dalvikvm(853): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-30 06:15:57.213: E/AndroidRuntime(853): FATAL EXCEPTION: main
07-30 06:15:57.213: E/AndroidRuntime(853): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.navigationdrawer3/com.example.navigationdrawer3.MainActivity}: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.os.Looper.loop(Looper.java:137)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.app.ActivityThread.main(ActivityThread.java:5041)
07-30 06:15:57.213: E/AndroidRuntime(853):  at java.lang.reflect.Method.invokeNative(Native Method)
07-30 06:15:57.213: E/AndroidRuntime(853):  at java.lang.reflect.Method.invoke(Method.java:511)
07-30 06:15:57.213: E/AndroidRuntime(853):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-30 06:15:57.213: E/AndroidRuntime(853):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-30 06:15:57.213: E/AndroidRuntime(853):  at dalvik.system.NativeStart.main(Native Method)
07-30 06:15:57.213: E/AndroidRuntime(853): Caused by: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.support.v4.widget.DrawerLayout.isDrawerView(DrawerLayout.java:809)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.support.v4.widget.DrawerLayout.closeDrawer(DrawerLayout.java:1012)
07-30 06:15:57.213: E/AndroidRuntime(853):  at com.example.navigationdrawer3.MainActivity.selectItem(MainActivity.java:265)
07-30 06:15:57.213: E/AndroidRuntime(853):  at com.example.navigationdrawer3.MainActivity.onCreate(MainActivity.java:86)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.app.Activity.performCreate(Activity.java:5104)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-30 06:15:57.213: E/AndroidRuntime(853):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-30 06:15:57.213: E/AndroidRuntime(853):  ... 11 more

The line of code at line 86:

selectItem(0);

The line of code at line 265:

mDrawerLayout.closeDrawer(mDrawerLayout);

I have tried to correct this run time erroe in many ways but failed to correct. Can any one suggest a answer for my problem.

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

What solved this issue for me:

In MainActivity, add a new field for the LinearLayout, and assign value to it in onCreate() (this part just like emaleavil suggested):

private LinearLayout linearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
}

Then in selectItem(), when calling closeDrawer(), simply pass linearLayout as argument:

drawerLayout.closeDrawer(linearLayout);

Solution 2

I had the same problem. I just got rid of using,

mDrawerLayout.closeDrawer(Gravity.LEFT);

Solution 3

Answer:

mDrawerLayout.closeDrawer(mDrawerLayout);

had wrong Layout. so change in it with drawerlayout will work it out.

Solution 4

I had the same issue… Solution in my case was:

In your MainActivity add:

private LinearLayout linearLayout;

public void onCreate(Bundle savedInstanceState){

    ...
linearLayout = (LinearLayout)findViewById(R.id.linearLayout);
    ...

}

OnPrepareOptionsMenu:

@Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            boolean drawerOpen = mDrawerLayout.isDrawerOpen(this.linearLayout);
            menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
            return super.onPrepareOptionsMenu(menu);
}

I’m sorry for my poor english.

Solution 5

I think you should place your content and drawer exactly as it is siad in the manual.
Now yor XML structure doesn’t match that. Note, that only the “id” field should match, the view types and parameters may be different.

Solution 6

finally I found the way to implement a custom listView in the drawer layout. This is the post that help me to do it…http://www.michenux.net/android-navigation-drawer-748.html

Solution 7

mDrawerLayout.closeDrawer(mDrawerLayout);

or

mDrawerLayout.closeDrawer(Gravity.LEFT);

both is ok.NOTE:you must know What is parameter.

Have a nice day !

Solution 8

For those who are getting this exception when using NavigationView inside the DrawerLayout and want to close the menu without showing closing animation:

call this method:
drawerLayout.closeDrawer(navigationView, false)

first param: the navigationView from the inflated layout, second param: boolean to display closing animation

(Using com.google.android.material.navigation.NavigationView
androidx.drawerlayout.widget.DrawerLayout)

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply