web-dev-qa-db-fra.com

ClassCastException Android.widget.FrameLayout $ LayoutParams vers Android.support.v4.widget.DrawerLayout $ LayoutParams

Je travaille sur le tiroir de navigation pour Android. Selon mon exigence, je devais afficher la vue de la grille et la liste des éléments dans le tiroir de navigation. J'ai créé un linearLayout dans le fichier xml de mise en page et placé les deux widgets (Grid view et Listview) dans le LinearLayout.

Lorsque j'exécute le fichier, j'obtiens l'erreur suivante:

Java.lang.RuntimeException: impossible de démarrer l'activité ComponentInfo {com.example.navigationdrawer3/com.example.navigationdrawer3.MainActivity}: Java.lang.ClassCastException: Android.widget.FrameLayout $ LayoutParams ne peut pas être casté sur Android. support.v4.widget.DrawerLayout $ LayoutParams

Voici mes fichiers de disposition Java, logcat et NavigationDrawer:

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

La ligne de code à la ligne 86:

selectItem(0);

La ligne de code à la ligne 265:

mDrawerLayout.closeDrawer(mDrawerLayout);

J'ai essayé de corriger cet erroe de temps d'exécution de plusieurs manières mais je n'ai pas réussi à le corriger. Quelqu'un peut-il suggérer une réponse à mon problème.

39
Seenu69

Répondre:

mDrawerLayout.closeDrawer(mDrawerLayout);

avait une mauvaise disposition. alors changez-le avec la disposition des tiroirs.

21
Armaan Stranger

Ce qui a résolu ce problème pour moi:

Dans MainActivity, ajoutez un nouveau champ pour le LinearLayout, et affectez-lui une valeur dans onCreate() (cette partie comme emaleavil suggérée ):

private LinearLayout linearLayout;

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

Puis dans selectItem(), lors de l'appel de closeDrawer(), passez simplement linearLayout comme argument:

drawerLayout.closeDrawer(linearLayout);
36
Jonik

J'ai eu le même problème. Je viens de me débarrasser de l'utilisation,

mDrawerLayout.closeDrawer(Gravity.LEFT);
27

J'ai eu le même problème ... La solution dans mon cas était:

Dans votre MainActivity, ajoutez:

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

Je suis désolé pour mon pauvre anglais.

16
emaleavil

enfin j'ai trouvé le moyen d'implémenter une listView personnalisée dans la disposition des tiroirs. Ceci est le message qui m'aide à le faire ... http://www.michenux.net/Android-navigation-drawer-748.html

2
emaleavil

Je pense que vous devriez placer votre contenu et votre tiroir exactement comme il est dans le manuel . Maintenant, votre structure XML ne correspond pas à cela. Notez que seul le champ "id" doit correspondre, les types de vue et les paramètres peuvent être différents.

2
Maxim Efimov
mDrawerLayout.closeDrawer(mDrawerLayout);

ou

mDrawerLayout.closeDrawer(Gravity.LEFT);

les deux sont ok.REMARQUE: vous devez savoir quel est le paramètre.

Bonne journée !

1
张浩鹏

Pour ceux qui obtiennent cette exception lors de l'utilisation de NavigationView dans DrawerLayout et qui souhaitent fermer le menu sans afficher d'animation de fermeture:

appeler cette méthode: tiroirLayout.closeDrawer (navigationView, false)

premier paramètre: la navigation Vue depuis la disposition gonflée, deuxième paramètre: booléen pour afficher l'animation de fermeture

(Utilisation de com.google.Android.material.navigation.NavigationView androidx.drawerlayout.widget.DrawerLayout)

0
Stas Krantsov