Caused by: android.view.InflateException:Binary XML file line #:Error inflating class 問題

問題

這兩天做功能需要修改一個佈局文件,遇到了inflating class問題。

分析

查看錯誤信息:
Binary XML file line:XML文件問題。
inflating class顧名思義是不能“初始化”類對象。
也就可以通過錯誤信息得出,是由於加載佈局文件時,無法解析導致程序異常。

示例分析

出錯代碼:佈局結構爲dialpad_button中引用dialpad佈局。
dialpad_button.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialpadbutton"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:clipChildren="false">
    <include layout="@layout/dialpad" />
</LinearLayout>

dialpad.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialpad"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:clipChildren="false">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">
        <Space style="@style/DialpadSpaceStyle" />
        <include layout="@layout/dialpad_key_one" />
        <include layout="@layout/dialpad_key"
            android:id="@+id/two"
            style="@style/DialpadKeyButtonStyle"/>
        <include layout="@layout/dialpad_key"
            android:id="@+id/three"
            style="@style/DialpadKeyNumberStyle" />
        <Space style="@style/DialpadSpaceStyle" />
    </LinearLayout>
</LinearLayout>

style.xml:

    <style name="DialpadKeyNumberStyle">
        <item name="android:textColor">?attr/dialpad_text_color_primary</item>
        <item name="android:textSize">@dimen/dialpad_key_numbers_size</item>
        <item name="android:fontFamily">sans-serif-light</item>
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginBottom">@dimen/dialpad_key_number_margin_bottom</item>
        <item name="android:gravity">center</item>
    </style>

結果運行時,就出現瞭如下錯誤:

*06-21 16:26:07.985 10789-10789/com.android.dialer E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: com.android.dialer, PID: 10789
                                                                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.dialer/com.android.incallui.InCallActivity}: android.view.InflateException: Binary XML file line #107: Binary XML file line #51: Binary XML file line #22: Error inflating class <unknown>
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2745)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2810)
                                                                        at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1529)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:110)
                                                                        at android.os.Looper.loop(Looper.java:203)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6275)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
                                                                     Caused by: android.view.InflateException: Binary XML file line #107: Binary XML file line #51: Binary XML file line #22: Error inflating class <unknown>
                                                                     Caused by: android.view.InflateException: Binary XML file line #51: Binary XML file line #22: Error inflating class <unknown>
                                                                     Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class <unknown>
                                                                     Caused by: java.lang.reflect.InvocationTargetException
                                                                        at java.lang.reflect.Constructor.newInstance0(Native Method)
                                                                        at java.lang.reflect.Constructor.newInstance(Constructor.java:430)*

根據上面分析,一定是是dialpad解析初始化時出錯了。那麼哪裏出錯了呢?。對於這種問題,請仔細檢查你的佈局文件,錯誤一定是在你的佈局文件當中,不要放過每個細節

經過仔細查看(這個過程無疑是比較痛苦的,請堅持下去),發現問題根源,在dialpad佈局中使用的style=”@style/DialpadKeyNumberStyle”,我們回過頭再看下DialpadKeyNumberStyle的定義中使用了<item name="android:textColor">?attr/dialpad_text_color_primary</item> ,問題就出現這個屬性應用當中,dialpad_text_color_primary什麼時候定義的?結果發現沒有地方定義!!

修改後的代碼:
dialpad_button.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialpadbutton"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:theme="@style/Dialpad_Light"
    android:clipChildren="false">
    <include layout="@layout/dialpad" />
</LinearLayout>

Dialpad_Light的定義

    <style name="Dialpad_Light">
        <item name="dialpad_text_color">@android:color/black</item>
        <item name="dialpad_text_color_primary">@android:color/black</item>
        <item name="dialpad_text_color_secondary">@color/dialpad_secondary_text_color</item>
        <item name="dialpad_icon_tint">@color/dialpad_icon_tint</item>
        <item name="dialpad_voicemail_tint">@color/dialpad_secondary_text_color</item>
        <item name="dialpad_background">@color/background_dialpad</item>
    </style>

可以看到這裏爲dialpad_button新增了theme,而theme中定義了我們後面使用到的資源(這個可以理解爲,theme是我定義的成員變量塊,後面DialpadKeyNumberStyle中的是對成員變量的使用,如果使用了未定義的成員變量,那麼就會報錯


小結

總結爲兩點需注意:

  1. 對於該類型的錯誤,仔細審閱xml文件,問題就在這,不要讓其他來分散你的注意力。
  2. android:theme=”@style/Dialpad_Light”;Theme的用法,可以定義相關item變量,供後續的佈局進行使用(可以使用java代碼的思維進行理解)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章