搞了很久android了,今天没想到在VerctorDrawable翻车了,一直在android 7.0的机器上开发的,考虑到更多用户机型版本的题,在android 4.4上翻车了,一直在报找不到图片资源文件的错误,折腾一番,发现是VectorDrawable xml资源文件的问题,发现在android 5.0一下不支持VectorDrawable,需要兼容一下。
错误大致如下
Caused by: android.view.InflateException: Binary XML file line #78: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInfl ater.java:620)
at android.view.LayoutInflater.createViewFromTag( LayoutInflater.java:696)
at android.view.LayoutInflater.rInflate(LayoutInflater .java:755)
at android.view.LayoutInflater.rInflate(LayoutInflater .java:758)
at android.view.LayoutInflater.inflate(LayoutInflater.j ava:492)
at android.view.LayoutInflater.inflate(LayoutInflater.j ava:397)
at android.view.LayoutInflater.inflate(LayoutInflater.j ava:353)
at android.support.v7.app.AppCompatDelegateImpl V9.setContentView(AppCompatDelegateImplV9.j ava:287)
at android.support.v7.app.AppCompatActivity.setC ontentView(AppCompatActivity.java:139)
at com.xbw.bjut.ReviewActivity.onCreate(ReviewAc tivity.java:121)
at android.app.Activity.performCreate(Activity.java: 5263)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1087)
at
android.app.ActivityThread.performLaunchActivit y(ActivityThread.java:2172)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2257)
at android.app.ActivityThread.access$900(ActivityT hread.java:137)
at android.app.ActivityThread$H.handleMessage(A ctivityThread.java:1202)
at android.os.Handler.dispatchMessage(Handler.ja va:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.j ava:5089)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java: 515)
at com.android.internal.os.ZygoteInit$MethodAndAr gsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteIn it.java:608)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Nati ve Method)
at java.lang.reflect.Constructor.newInstance(Constr uctor.java:423)
at
android.view.LayoutInflater.createView(LayoutInfl ater.java:594)
at android.view.LayoutInflater.createViewFromTag( LayoutInflater.java:696)
at android.view.LayoutInflater.rInflate(LayoutInflater .java:755)
at android.view.LayoutInflater.rInflate(LayoutInflater .java:758)
at android.view.LayoutInflater.inflate(LayoutInflater.j ava:492)
at android.view.LayoutInflater.inflate(LayoutInflater.j ava:397)
at android.view.LayoutInflater.inflate(LayoutInflater.j ava:353)
at android.support.v7.app.AppCompatDelegateImpl V9.setContentView(AppCompatDelegateImplV9.j ava:287)
at android.support.v7.app.AppCompatActivity.setC ontentView(AppCompatActivity.java:139)
at com.xbw.bjut.ReviewActivity.onCreate(ReviewAc tivity.java:121)
at android.app.Activity.performCreate(Activity.java: 5263)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivit y(ActivityThread.java:2172)
at android.app.ActivityThread.handleLaunchActivity
(ActivityThread.java:2257) at
android.app.ActivityThread.access$900(ActivityT hread.java:137)
at android.app.ActivityThread$H.handleMessage(A ctivityThread.java:1202)
at android.os.Handler.dispatchMessage(Handler.ja va:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.j ava:5089)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java: 515)
at com.android.internal.os.ZygoteInit$MethodAndAr gsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteIn it.java:608)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.content.res.Resources$NotFoundExcept ion: File res/drawable/ic_write.xml from drawable resource ID #0x7f0200d0
at android.content.res.Resources.loadDrawable(Re sources.java:2096)
at android.content.res.TypedArray.getDrawable(Typ edArray.java:602)
at android.widget.ImageView.<init>(ImageView.java :129)
at android.widget.ImageButton.<init>(ImageButton.j ava:87)
at android.support.design.widget.VisibilityAwareIma geButton.<init>(VisibilityAwareImageButton.java: 36)
at android.support.design.widget.FloatingActionButt on.<init>(FloatingActionButton.java:155)
at android.support.design.widget.FloatingActionButt on.<init>(FloatingActionButton.java:151)
at java.lang.reflect.Constructor.constructNative(Nati ve Method)
at java.lang.reflect.Constructor.newInstance(Constr uctor.java:423)
at android.view.LayoutInflater.createView(LayoutInfl ater.java:594)
at android.view.LayoutInflater.createViewFromTag( LayoutInflater.java:696)
at android.view.LayoutInflater.rInflate(LayoutInflater .java:755)
at android.view.LayoutInflater.rInflate(LayoutInflater .java:758)
at android.view.LayoutInflater.inflate(LayoutInflater.j ava:492)
at android.view.LayoutInflater.inflate(LayoutInflater.j ava:397)
at android.view.LayoutInflater.inflate(LayoutInflater.j ava:353)
at
android.support.v7.app.AppCompatDelegateImpl V9.setContentView(AppCompatDelegateImplV9.j ava:287)
at android.support.v7.app.AppCompatActivity.setC ontentView(AppCompatActivity.java:139)
at com.xbw.bjut.ReviewActivity.onCreate(ReviewAc tivity.java:121)
at android.app.Activity.performCreate(Activity.java: 5263)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivit y(ActivityThread.java:2172)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2257)
at android.app.ActivityThread.access$900(ActivityT hread.java:137)
at android.app.ActivityThread$H.handleMessage(A ctivityThread.java:1202)
at android.os.Handler.dispatchMessage(Handler.ja va:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.j ava:5089)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java: 515)
at
com.android.internal.os.ZygoteInit$MethodAndAr gsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteIn it.java:608)
at dalvik.system.NativeStart.main(Native Method)
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #1: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFrom XmlInner(Drawable.java:933)
解决方案:
//在gradle2.0及以上:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}}
//在gradle 1.5以前
android {
defaultConfig {
// Stops the Gradle plugin’s automatic rasterization of vectors
generatedDensities = []
}
// Flag to tell aapt to keep the attribute ids around
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
在布局文件中这样引用VectorDrawable,使用 app:srcCompat
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@drawable/ic_write" />
然而问题又来了,代码里有引用VectorDrawable的地方
images = new int[]{
R.drawable.btn_fire,
R.drawable.btn_msg,
R.drawable.btn_find};
我们需要让Activity继承AppCompatActivity
并且添加
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//矢量图兼容
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
这样貌似没有问题了。