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.

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

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 puedo hacer que un elemento específico del cajón de navegación aparezca seleccionado?
  • ActionLayout para los elementos de la vista de navegación se muestra en el lado derecho
  • ¿Cómo utilizar el diseño de material de acción barra de navegación de cajón animación de conmutación?
  • Pestañas de la barra de acción con ViewPager con el cajón de navegación
  • Cajón de navegación cambio de color
  • Cajón de navegación coexistente y diseño de panel deslizante
  • El título de CollapsingToolbarLayout desaparece
  • Cajón de navegación de estilo de diseño de Android 5.0 para KitKat
  • Mover el sherlock de la barra de acción con el menú de navegación del cajón
  • Cajón de navegación Elementos que no registran el evento de clic
  • Cajón de navegación con la actividad y el niño Fragmentos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.