bug_ _ android.view.InflateException: Binary XML file line #2: Error inflating class <unknown
========= 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 啥的,找不到那个东西。
其实就是你再重新把资源载入一下就好了。