studio ejemplo con activities android android-layout framelayout navigation-drawer drawerlayout

android - ejemplo - navigation drawer material design



ClassCastException android.widget.FrameLayout $ LayoutParams a android.support.v4.widget.DrawerLayout $ LayoutParams (7)

Estoy trabajando en el Cajón de navegación para Android. Según mi requisito, debía mostrar la vista en cuadrícula y la vista de lista de los elementos en el panel de navegación. He creado un LineLayout en el archivo xml de diseño y coloqué los dos widgets (vista de cuadrícula y vista de lista) en LinearLayout.

Cuando ejecuto el archivo recibo el siguiente error:

java.lang.RuntimeException: no se puede iniciar la actividad ComponentInfo {com.example.navigationdrawer3 / com.example.navigationdrawer3.MainActivity}: java.lang.ClassCastException: android.widget.FrameLayout $ LayoutParams no se puede convertir a android.support.v4. widget.DrawerLayout $ LayoutParams

A continuación se encuentran mis archivos de diseño java, logcat y 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 línea de código en la línea 86:

selectItem(0);

La línea de código en la línea 265:

mDrawerLayout.closeDrawer(mDrawerLayout);

He intentado corregir este error de tiempo de ejecución de muchas maneras pero no he podido corregirlo. ¿Alguien puede sugerir una respuesta para mi problema?


Creo que debe colocar su contenido y el cajón exactamente como está en el manual . Ahora, la estructura XML de Yor no coincide con eso. Tenga en cuenta que solo el campo "id" debe coincidir, los tipos de vista y los parámetros pueden ser diferentes.


Lo que resolvió este problema para mí:

En MainActivity , agregue un nuevo campo para LinearLayout y asigne valor a él en onCreate() (esta parte como emaleavil sugirió ):

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

Luego, en selectItem() , al llamar a closeDrawer() , simplemente pase linearLayout como argumento:

drawerLayout.closeDrawer(linearLayout);


Responder:

mDrawerLayout.closeDrawer(mDrawerLayout);

tenía un diseño incorrecto así que cambiarlo con drawerlayout lo resolverá.


Tuve el mismo problema ... La solución en mi caso fue:

En su MainActivity, agregue:

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

Lo siento por mi pobre inglés.


Yo tuve el mismo problema. Me deshice de usar,

mDrawerLayout.closeDrawer(Gravity.LEFT);



mDrawerLayout.closeDrawer(mDrawerLayout);

o

mDrawerLayout.closeDrawer(Gravity.LEFT);

ambos están bien.NOTA: debes saber qué es el parámetro.

Que tengas un buen día !