問題
這兩天做功能需要修改一個佈局文件,遇到了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中的是對成員變量的使用,如果使用了未定義的成員變量,那麼就會報錯)
小結
總結爲兩點需注意:
- 對於該類型的錯誤,仔細審閱xml文件,問題就在這,不要讓其他來分散你的注意力。
- android:theme=”@style/Dialpad_Light”;Theme的用法,可以定義相關item變量,供後續的佈局進行使用(可以使用java代碼的思維進行理解)。