android - 抽屉导航不适用于 ICS 之前的版本

标签 android navigation-drawer

我已经实现了基于 ListView 的抽屉导航。它与 ICS 和更高版本的 Android 完美配合。但是,在旧版本上,它会因以下错误而崩溃:

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

我曾尝试将这个特定的 xml 文件从 Android sdk 复制到我自己的项目中,但这没有帮助。

这是 xml 文件(删节):

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

还有代码:

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

完整的堆栈跟踪:

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

最佳答案

Navigation drawer 的官方 Google 示例,将此 TextView 作为 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"/>

但是,使用这三个属性值,应用程序在 ICS 之前的安卓操作系统上失败。我通过提供我自己的自定义值(与这些值不同的任何值)进行了验证,它在每个版本上都像魔术一样工作。

关于android - 抽屉导航不适用于 ICS 之前的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17261230/

相关文章:

android - 谷歌地图 V2 和 HTC Wildfire S : Outofmemory error

Android:提供者测试用例 2 和 getFilesDir()

android - 更改抽屉导航按钮(后退按钮)的颜色?

android - 带分隔符的 RecyclerView 抽屉导航

Android:不希望 ListView 使用完整的抽屉

Nexus 7 上未调用 Android Jellybean onCreateOptionsMenu

android - 识别已在 expandableListView 中单击的组

Android 排行榜和成就弃用

android - SearchView Android 中的自定义图标

java - Picasso 如何从 URL 接收图标并在第一次访问时显示它而不是重新运行应用程序?