ActionBarCompat + NavigationDrawerFragment no funciona en android 4.0 y 4.1
Muy extraño problema! He creado un nuevo proyecto a través de un nuevo asistente de proyecto en android studio. Elegí incluir bibliotecas de soporte para GridLayout, Fragments, NavigationDrawer y ActionBar. En el paso siguiente elegí BlankActivity Template con NavigationDrawer. Wizard creó mi proyecto y lo construyó sin ningún problema.
El problema es esto, cuando se intenta ejecutarlo, funciona bien en Android 4.3, 4.2 y 2.3.3, pero se bloquea en 4.0 y 4.1.
- Adición de una imagen grande a un cajón de navegación (SlidingMenu libs) - ¿Cómo?
- Desactivar la hamburguesa para animar las flechas
- Cómo agregar un separador de sección para el cajón de navegación en Android?
- ¿Cómo añado iconos a la plantilla de gavetas de navegación de Android Studio?
- Nuevo ícono oficial para Android Navigation Drawer
Rastro de la pila:
10-30 13:11:31.024 2136-2136/? E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.navdrawer/com.navdrawer.MainActivity}: android.view.InflateException: Binary XML file line #24: Error inflating class fragment at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access$600(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #24: Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) at android.view.LayoutInflater.inflate(LayoutInflater.java:489) at android.view.LayoutInflater.inflate(LayoutInflater.java:396) at android.view.LayoutInflater.inflate(LayoutInflater.java:352) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256) at android.app.Activity.setContentView(Activity.java:1867) at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208) at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111) at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76) at com.navdrawer.MainActivity.onCreate(MainActivity.java:37) at android.app.Activity.performCreate(Activity.java:5008) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access$600(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at com.navdrawer.MainActivity.onCreateOptionsMenu(MainActivity.java:82) at android.app.Activity.onCreatePanelMenu(Activity.java:2476) at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:224) at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:224) at android.support.v7.app.ActionBarActivityDelegateICS.onCreatePanelMenu(ActionBarActivityDelegateICS.java:141) at android.support.v7.app.ActionBarActivity.onCreatePanelMenu(ActionBarActivity.java:199) at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.onCreatePanelMenu(ActionBarActivityDelegateICS.java:280) at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:393) at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:747) at android.app.Activity.invalidateOptionsMenu(Activity.java:2595) at android.support.v4.app.ActivityCompatHoneycomb.invalidateOptionsMenu(ActivityCompatHoneycomb.java:29) at android.support.v4.app.FragmentActivity.supportInvalidateOptionsMenu(FragmentActivity.java:633) at android.support.v7.app.ActionBarActivity.supportInvalidateOptionsMenu(ActionBarActivity.java:170) at android.support.v4.app.Fragment.setHasOptionsMenu(Fragment.java:781) at com.navdrawer.NavigationDrawerFragment.onCreate(NavigationDrawerFragment.java:82) at android.support.v4.app.Fragment.performCreate(Fragment.java:1455) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1184) at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:285) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) ... 24 mo
Este es el onCreateOptionsMenu en el fragmento
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // If the drawer is open, show the global app actions in the action bar. See also // showGlobalContextActionBar, which controls the top-left area of the action bar. if (mDrawerLayout != null && isDrawerOpen()) { inflater.inflate(R.menu.global, menu); showGlobalContextActionBar(); } super.onCreateOptionsMenu(menu, inflater); }
Este se encuentra en la MainActivity
@Override public boolean onCreateOptionsMenu(Menu menu) { if (!mNavigationDrawerFragment.isDrawerOpen()) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.main, menu); restoreActionBar(); return true; } return super.onCreateOptionsMenu(menu); }
- ¿Cómo utilizo DrawerLayout para mostrar sobre la Barra de Acción / Barra de herramientas y debajo de la barra de estado?
- ¿Cómo comprobar si el cajón de navegación está abierto?
- Reemplazar el diseño de la barra de herramientas de acuerdo con el fragmento visualizado
- Cómo hacer navegación personalizada ver animaciones como ésta
- Android: Capaz de hacer clic a través del cajón de nav? AppCompat v7: r21
- Buenas prácticas: Cajón de navegación
- Notificación de la divisa en la barra de herramientas en la barra de herramientas - Android
- Cambiar entre la imagen de la gaveta de navegación de Android y el cursor hacia arriba al utilizar fragmentos
Sólo se encontró con este mismo problema. CUESTIÓN EXACTA.
El problema es que setHasOptionsMenu(true);
Se llama en onCreate
en lugar de onActivityCreated
en el fragmento. Parece un error en el mago si me preguntas.
Para resolver esto, mueva el setHasOptionsMenu(true);
Llame de onCreate()
a onActivityCreated()
.
Esto solucionará el problema. En el momento en que la llamada llegue a Activity#onCreateOptionsMenu
la instancia de fragmento será instanciada.
Resolví el problema. El rastro de la pila me faltó por completo a mí …
El problema fue como eee sugerido en onCreateOptionsMenu () en la actividad …
@Override public boolean onCreateOptionsMenu(Menu menu) { if (!mNavigationDrawerFragment.isDrawerOpen()) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.main, menu); restoreActionBar(); return true; } return super.onCreateOptionsMenu(menu); }
De alguna manera sólo en Android 4.1 y 4,0 mNavigationDrawerFragment
es nulo aunque se inicializó en onCreate()
así que poner esto
if(mNavigationDrawerFragment == null ) mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
Tanto en onCreate()
como en el método onCreateOptionsMenu()
He resuelto este problema simplemente poniendo un try bloque de captura para el
setHasOptionsMenu(true);
Como Donn Felker explicó la excepción se produce debido a la llamada antes de la actividad se crea. Manejar esta excepción puede solucionar el problema.
- ¿Cómo instalar las herramientas de distribución de restricciones de Android fuera de Android Studio mediante la línea de comandos?
- Intervalo de IP del servidor de notificación de Google GCM push?