Navigation box does not work with versions prior to ICS

I have implemented a navigation box based on ListView. It works great with ICS and on Android versions. However, in earlier versions, it crashes with this 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 

I tried copying this specific xml file from Android sdk to my own project, but that didn't help.

Here's the xml file (abbreviated):

 <?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> 

And the code:

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

Full stack trace:

 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 
+4
source share
2 answers

The official Google example for the navigation box gives this TextView as part of 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"/> 

However, with these exact three attribute values, the application crashes on the OS prior to Android ICS. I checked by providing my own values ​​(something different from them) and it works like magic on every version.

+8
source

The official example of a navigation explorer has a minimum level of API 14. If this minimum is set in the ICS version (for example, 11), this will force a close, as the setHomeButton method is available only through API-14.

 getActionBar().setHomeButtonEnabled(true); 

When commenting on the previous statement, this leads to the exclusion of bloat, which is the result of using adroid sizes, which are also added to 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"/> 

For my application, in which I support API-11 +, I solved it as follows.

1) In drawer_list_item.xml refer to user attributes

 <?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) In the /attrs.xml values, specify your custom attributes

 <?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) In values-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) In values-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> 

If you want to support older / different versions, you need to add style.xml for this particular version.

+8
source

Source: https://habr.com/ru/post/1487718/


All Articles