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ó.
- Cajón de navegación de ambos lados izquierdo y derecho en una sola actividad
- Incluyendo fila en la parte inferior del cajón de navegación
- Cómo crear mini-menú de cajones en Android?
- NavigationDrawer desactivar el desplazamiento a la derecha
- Cajón No se muestra el cajón de navegación de salida
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
- Cómo ajustar el ancho del cajón de navegación en el estudio de Android
- Cajón de navegación Android Studio 1.4
- Guardar estado de fragmentos con el cajón de navegación
- Cambiar el color del ícono del cajón de navegación en la plantilla predeterminada de Android Studio
- Cajón arrastrable con un asa (en lugar de barra de acción) encima de otras aplicaciones
- ¿Cómo puedo añadir un elemento personalizado a un NavigationView con un diseño de menú?
- Elemento seleccionado en el cajón de navegación
- Configurar el color de fondo del cajón de navegación
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.
- Llamar a un método de actividad de una clase BroadcastReceiver
- ¿Cómo desarrollar aplicaciones Android?