El cajón de navegación no funciona en las versiones pre-ICS

He implementado el cajón de navegación basado en un ListView. Funciona perfectamente bien con ICS y versiones anteriores de Android. Sin embargo, en las versiones anteriores, se bloquea con este error:

06-23 15:50:11.570: E/AndroidRuntime(403): Caused by: android.content.res.Resources$NotFoundException: File res/drawable/list_selector_background.xml from xml type drawable resource ID #0x0 

He intentado copiar este archivo xml particular de Android sdk a mi propio proyecto, pero eso no ayudó.

Aquí está el archivo xml (abreviado):

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#dddddd" android:choiceMode="singleChoice" android:divider="@color/gray" android:dividerHeight="1dp" /> </android.support.v4.widget.DrawerLayout> 

Y el código:

 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.left_drawer); mDrawerLayout.openDrawer(mDrawerList); 

El rastreo completo de la pila:

 Uncaught handler: thread main exiting due to uncaught exception android.view.InflateException: Binary XML file line #1: Error inflating class <unknown> at android.view.LayoutInflater.createView(LayoutInflater.java:513) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) at android.view.LayoutInflater.inflate(LayoutInflater.java:385) at android.view.LayoutInflater.inflate(LayoutInflater.java:320) at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:332) at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323) at android.widget.AbsListView.obtainView(AbsListView.java:1274) at android.widget.ListView.makeAndAddView(ListView.java:1668) at android.widget.ListView.fillDown(ListView.java:637) at android.widget.ListView.fillFromTop(ListView.java:694) at android.widget.ListView.layoutChildren(ListView.java:1521) at android.widget.AbsListView.onLayout(AbsListView.java:1113) at android.view.View.layout(View.java:6830) at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:672) at android.view.View.layout(View.java:6830) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at android.view.View.layout(View.java:6830) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) at android.widget.LinearLayout.onLayout(LinearLayout.java:918) at android.view.View.layout(View.java:6830) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at android.view.View.layout(View.java:6830) at android.widget.FrameLayout.onLayout(FrameLayout.java:333) at android.view.View.layout(View.java:6830) at android.view.ViewRoot.performTraversals(ViewRoot.java:996) at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4363) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.reflect.InvocationTargetException at android.widget.TextView.<init>(TextView.java:320) at java.lang.reflect.Constructor.constructNative(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:446) at android.view.LayoutInflater.createView(LayoutInflater.java:500) ... 35 more Caused by: android.content.res.Resources$NotFoundException: File res/drawable/list_selector_background.xml from drawable resource ID #0x0 at android.content.res.Resources.loadDrawable(Resources.java:1693) at android.content.res.TypedArray.getDrawable(TypedArray.java:548) at android.view.View.<init>(View.java:1850) at android.widget.TextView.<init>(TextView.java:326) ... 39 more Caused by: android.content.res.Resources$NotFoundException: File res/drawable/list_selector_background.xml from xml type drawable resource ID #0x0 at android.content.res.Resources.loadXmlResourceParser(Resources.java:1920) at android.content.res.Resources.loadDrawable(Resources.java:1688) ... 42 more 

El ejemplo oficial de Google para el cajón de navegación, da este TextView como parte de drawer_list_item.xml

 <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:background="?android:attr/activatedBackgroundIndicator" android:minHeight="?android:attr/listPreferredItemHeightSmall"/> 

Sin embargo, con estos tres valores exactos de atributos, la aplicación falla en sistemas operativos pre-ICS android. Verifiqué dando mis propios valores de encargo (cualquier cosa diferente de éstos) y trabaja como magia en cada versión.

El ejemplo oficial del cajón de navegación tiene un nivel API mínimo de 14. En caso de que este mínimo se establezca en una versión ICS (por ejemplo, 11) esto resultará en un cierre forzado como método setHomeButton sólo está disponible a partir de API-14.

 getActionBar().setHomeButtonEnabled(true); 

Al comentar la sentencia anterior, esto resulta en inflar la excepción que es el resultado de usar las dimensiones de adroid que también se agregan en API-14.

 <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:background="?android:attr/activatedBackgroundIndicator" android:minHeight="?android:attr/listPreferredItemHeightSmall"/> 

Para mi aplicación en la que apoyo API-11 + he resuelto esto como sigue.

1) En drawer_list_item.xml consulte atributos personalizados

 <?xml version="1.0" encoding="UTF-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/myapp_activatedBackgroundIndicator" android:gravity="center_vertical" android:minHeight="?attr/myapp_listPreferredItemHeightSmall" android:paddingLeft="16dp" android:paddingRight="16dp" android:textAppearance="?attr/myapp_textAppearanceListItemSmall" /> 

2) En valores / attrs.xml, defina sus atributos personalizados

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Theme"> <!-- Attributes below are needed to support the navigation drawer on Android 3.x. --> <!-- A smaller, sleeker list item height. --> <attr name="myapp_listPreferredItemHeightSmall" format="dimension" /> <!-- Drawable used as a background for activated items. --> <attr name="myapp_activatedBackgroundIndicator" format="reference" /> <!-- The preferred TextAppearance for the primary text of small list items. --> <attr name="myapp_textAppearanceListItemSmall" format="reference" /> </declare-styleable> </resources> 

3) En valores-11 / styles.xml

 <resources> <!-- Base application theme for API 11+. This theme completely replaces --> <!-- AppBaseTheme from res/values/styles.xml on API 11+ devices. --> <style name="AppBaseTheme" parent="android:Theme.Holo"> <!-- API 11 theme customizations can go here. --> <!-- Implementation of attributes needed for the navigation drawer as the default implementation is based on API-14. --> <item name="myapp_listPreferredItemHeightSmall">48dip</item> <item name="myapp_textAppearanceListItemSmall">@style/MyappDrawerMenu</item> <item name="myapp_activatedBackgroundIndicator">@drawable/ab_transparent_action_bar</item> </style> <style name="MyappDrawerMenu"> <item name="android:textSize">16sp</item> <item name="android:textStyle">bold</item> <item name="android:textColor">?android:attr/actionMenuTextColor</item> </style> </resources> 

4) En valores-v14 / styles.xml

  <resources> <!-- Base application theme for API 14+. This theme completely replaces --> <!-- AppBaseTheme from BOTH res/values/styles.xml and --> <!-- res/values-v11/styles.xml on API 14+ devices. --> <style name="AppBaseTheme" parent="android:Theme.Holo"> <!-- For API-14 and above the default implementation of the navigation drawer menu is used. Below APU-14 a custom implementation is used. --> <item name="myapp_listPreferredItemHeightSmall">?android:attr/listPreferredItemHeightSmall</item> <item name="myapp_textAppearanceListItemSmall">?android:attr/textAppearanceListItemSmall</item> <item name="myapp_activatedBackgroundIndicator">?android:attr/activatedBackgroundIndicator</item> </style> </resources> 

En caso de que desee dar soporte a versiones anteriores / anteriores, deberá agregar un styles.xml para esa versión específica.

  • Icono de Android ic_drawer.png en color blanco?
  • Cajón de navegación siempre visible (un poco)
  • Abra el cajón de navegación haciendo clic en el icono de la aplicación
  • Cómo resolver tipos inconvertibles no puede lanzar "Android.support.v4.app.fragment" a "nombre de paquete"
  • El gaviota de navegación de Android no pasa onTouchEvent a la actividad
  • Navegación Ver Texto Multilínea
  • Optimizar el cajón y la velocidad de lanzamiento de la actividad
  • Toque en cualquier lugar para deslizar el menú abierto para el cajón de navegación
  • BaseActivity para la navegación
  • La flecha hacia arriba no se muestra después de llamar a ActionBarDrawerToggle.setDrawerIndicatorEnabled (false)
  • Cómo crear un cajón de navegación suave
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.