========= 5.0 android異常“android.view.InflateException: Binary XML file line # : Error inflating class”
今天用到viewPager寫了個小demo測試FragmentStatePagerAdapter和FragmentPagerAdapter的區別,忽然報出了“android.view.InflateException: Binary XML file line # : Error inflating class”錯誤,一時不知道如何下手,網上搜的解決法案都沒辦法行得通,最后不經意間調通了,現將解決法案說下:
1.看下ViewPager包名是否寫全了,如果沒有可能出現上面的錯誤。
2.如果是從網上下載下來的項目添加到工程中出現以上錯誤,在工程上右鍵選properties->android->library中刪掉所要添加的庫文件如:appcompat_v7,然后重新運行。如果可以運行之后再將這個庫給添加進去,具體原因不是很清楚。
以上是我的解決方法,我在網上也看到不少其他原因引起的,現在總結下,以后出現類似情況可以直接處理了:
1.自定義類引用為題:如寫一個自定義view,引用的時候需要用完整路徑。
2.構造函數問題:自定義一個View,必須派生實現基類View的三個構造函數
View(Context context) //Simple constructor to use when creating a view from code
View(Context context, AttributeSet attrs) //Constructor that is called when inflating a view from XML
View(Context context, AttributeSet attrs, int defStyle) //Perform inflation from XML and apply a class-specific base style
從文檔上的介紹來看,第二個和第三個構造函數對於XML這種引用方式是必須實現的,這三個構造函數應該是在不同的應用場合來實例化一個View對象。
3.找不到資源文件: 系統會根據分辨率來選擇加載不同drawable下文件夾的資源,如果只在一個文件下放了資源文件,不同的分辨率設備的會報錯。
4.編碼問題: 從github上下載一個開源組件demo導入到本地的Eclispe中,有可能出現這個錯誤,下載下來的有可能是UTF-8編碼,而本地eclipse有可能是gbk編碼。
5.內存泄漏: 內存泄漏也有可能引起這個情況。
============4.0 異常android.view.InflateException: Binary XML file line #…: Error inflating class …
具體還要看你遇到的問題的具體提示。 可能由於資源文件找不到xml, 可能是引用了不存在的資源, 可能是標簽中所引用的類不在同一包下。
例如"@drawable/..."所引用的圖片不存在;
或者
<com.yourpackege.yourLayout
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/transparent"/>中yourLayout這個類不在com.yourpackege中;等等。
Android.View.InflateException: Binary XMLFile Line #異常的解決
可能兩種原因引起:
原因一:
必須實現三個構造函數:
public GalleryFlow(Context context) {
super(context);
}
public GalleryFlow(Context context, AttributeSet attrs) {
super(context, attrs);
}
public GalleryFlow(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
原因二: 或者 XML中包錯!
<com.yourpackege.yourLayout
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/transparent"/> 中yourLayout這個類不在com.yourpackege中。
原因三:由於虛擬機的內存不夠,所以需要清理虛擬機,或者 新建一個內存大的虛擬機。
======== 3、0 android.view.InflateException: Binary XML file line #2: Error inflating class 的解決方法
java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.xs8.app/cn.xs8.app.activity.news.Xs8_News_SplashActivity}:
android.view.InflateException: Binary XML file line #2: Error inflating class
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2200)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2262)
at android.app.ActivityThread.access$600(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5145)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:802)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:569)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class
at android.view.LayoutInflater.createView(LayoutInflater.java:613)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
at android.app.Activity.setContentView(Activity.java:1943)
at cn.xs8.app.activity.Xs8_BaseActivity.onCreate(Xs8_BaseActivity.java:74)
at cn.xs8.app.activity.news.Xs8_News_SplashActivity.onCreate(Xs8_News_SplashActivity.java:95)
at android.app.Activity.performCreate(Activity.java:5174)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2164)
... 11 more
查看了很多資料都沒解決,仔細看看就是沒有找到資源文件,看看res/下面的資源文件,全放在drawable-mdpi/目錄下,突然靈光一現,
懷疑尋找的位置資源文件不存在,於是將drawable-mdpi/下的資源文件拷貝一份到drawable-ldpi/目錄下,還是報上面的錯誤,再拷貝一份到drawable-hdpi/目錄下,問題解決。
還有另外一種解決方法是在res/下建一目錄drawable/,將drawable-mdpi/下所有的資源文件都拷貝到drawable/下即可
============ 2.2 xml中 TextView引用已定義好的樣式時出錯:android.view.InflateException: Binary XML file line #14: Error inflating class
【問題】
android中,在一個xml布局文件中,對於實現已經定義好的樣式:
|
1
2
3
4
5
|
<
style
name
=
"NormalText"
>
<
item
name
=
"android:textSize"
>14sp</
item
>
<
item
name
=
"android:textStyle"
>normal</
item
>
<
item
name
=
"android:textColor"
>@color/Gray1</
item
>
</
style
>
|
去引用:
|
1
2
3
4
5
6
7
8
9
|
<
TextView
android:id
=
"@+id/scanDeviceHint"
android:layout_width
=
"230dp"
android:layout_height
=
"30dp"
android:layout_marginLeft
=
"10dp"
android:layout_marginTop
=
"10dp"
android:text
=
"@string/search_device_hint_text"
android:textStyle
=
"@style/NormalText"
>
</
TextView
>
|
結果出錯:
| 04-08 13:40:23.489: E/AndroidRuntime(17541): FATAL EXCEPTION: main 04-08 13:40:23.489: E/AndroidRuntime(17541): at |
【解決過程】
1.后來才注意到,其實錯誤信息中,已經指出來了對應的錯誤的位置了:
XML file line #14就是此處上面貼出來的錯誤的部分。
2.后來去參考:
Styles and Themes | Android Developers感覺應該是把:
|
1
|
android:textStyle="@style/NormalText"
|
改為:
|
1
|
style="@style/NormalText"
|
變為:
|
1
2
3
4
5
6
7
8
9
|
<
TextView
android:id
=
"@+id/scanDeviceHint"
android:layout_width
=
"230dp"
android:layout_height
=
"30dp"
android:layout_marginLeft
=
"10dp"
android:layout_marginTop
=
"10dp"
android:text
=
"@string/search_device_hint_text"
style
=
"@style/NormalText"
>
</
TextView
>
|
結果是:的確可以了。
【總結】
對於Text等內容,去引用已經定義好的Style的話,是:<TextView style="@style/xxx">
而不是:<TextView android:style="@style/xxx">其中,@所引用的xxx的style中, 會包含對應的android:style的相關定義的。
===== 2。1 Android運行時異常“Binary XML file line # : Error inflating class”
在原生Android下編譯APK,編譯沒有問題,但是在運行的時候經常出現如標題所描述的異常,然后整個程序Crash掉......
我遇到該問題常常都是因為修改了資源文件所引起,大致有以下幾種方式來解決:
1. 引用類名問題:自定義了一個View,將他用於布局文件中,假設他的包名叫MyPackage,類名叫MyTestView,這個時候你在XML作為布局元素來布局的話,必須使用完整路徑名,也就是包名加類名來引用,用MyPackage.MyTestView來進行引用。
2.構造函數問題:自定義一個View,必須派生實現基類View的三個構造函數
View(Context context) //Simple constructor to use when creating a view from code
View(Context context, AttributeSet attrs) //Constructor that is called when inflating a view from XML
View(Context context, AttributeSet attrs, int defStyle) //Perform inflation from XML and apply a class-specific base style
從文檔上的介紹來看,第二個和第三個構造函數對於XML這種引用方式是必須實現的,這三個構造函數應該是在不同的應用場合來實例化一個View對象。
3.編譯的中間文件沒有清理干凈:第三種就是你在原生系統代碼的編譯環境下編譯APK之后,特別是修改了XML,出現標題所述現象,這個時候你只需要刪除out目錄下編譯生成的中間文件夾即可(具體名字記不清了:在編譯過程中,系統會將那個位置打印出來,通過串口來看吧,.../out/....../..../classes.dex,你循着這個路徑往前推到你的應用的project名字那一層文件夾),刪除再重新make就OK了。
4.找不到資源文件:我原來在2.3的原生系統增加動態壁紙的時候,動態壁紙一跑起來就出這個異常,然后crash,當時就是因為找不到drawable的資源文件,於是當時我把drawable的hdpi或nodpi等文件夾的圖片資源都拷貝一份到drawble下,問題解決(當時一直不明白系統會根據分辨率來選擇加載不同drawable下文件夾的資源,為什么這里必須放入drawable中)。
找不到資源文件? 我也被這個問題困擾過。后來才知道系統應用在編譯時並不一定會將所有分辨率的資源文件都打包到apk文件里。可參考:
http://blog.csdn.net/go_rice_/article/details/6096316
必須補充下我遭遇到的確實也是“第5種”...
5.XML語法有隱蔽錯誤
e.g. android:textSize="@style/Text.Mediumn"
這樣的錯誤、編譯時是並不會報錯的,竟然會變成動態執行時錯誤...
感覺至少應該加強一下報錯粒度。
遇到這樣的:平常我們會把第三方library引入自己的項目里,可是我們的項目里已經有android-support-v4.jar這個包,而library里也有這個,
在運行時可能就會出現ClassNotFoundException,這時我們只要刪掉自己項目里的android-support-v4.jar,保留library里的jar包,程序就可以運行了。。
==== 2.0補充: Android 源碼編譯:資源樹下,將drawable-*等文件編譯到.apk里
在eclipse ADT環境下,drawable-hdpi/mdpi/ldmpi等drawable文件會被自動編譯到.apk文件里,但是在Source Tree下編譯的時候,因編譯環境的不同,系統可能並不會將所有drawable-*文件全部編譯到.apk文件里,這時,我們就不得不修改系統編譯環境。
方法1.在編譯時直接加上參數 $ make CUSTOM_LOCALES="hdpi mdpi ldpi"
方法2.在androidsrc/build/buildspc.mk.default 中進行如下修改
# Choose additional locales, like "en_US" or "it_IT", to add to any
# built product. Any locales that appear in CUSTOM_LOCALES but not in
# the locale list for the selected product will be added to the end
# of PRODUCT_LOCALES.
ifndef CUSTOM_LOCALES
CUSTOM_LOCALES:=hdpi mdpi ldpi
endif
修改完后將文件build.mk.default復制到androidsrc目錄下並將其重命名為build.mk。
==== 1 android.view.InflateException: Binary XML file line #2: Error inflating class <unknown
莫名其妙的出現這個錯,看了logcat 說是什么二進制xml錯誤啥的。。。
不過后來發現,這個一般都是給eclipse項目中添加圖片等資源時出現的一些bug,看似添加到項目中,其實沒有,或者是你是選取的引用模式,而你在外面又把那個圖片給重命名了,所以在jvm運行時會報錯,
說什么xml line # 2 啥的,找不到那個東西。
其實就是你再重新把資源載入一下就好了。
