首页 文章

在前棒棒糖上的矢量drawable崩溃

提问于
浏览
2

我发现前Lollipop设备上发生了很多矢量可绘制的崩溃,我无法重现它 .

一个是由 org.xmlpull.v1.XmlPullParserException: Binary XML file line #1: invalid drawable tag vector 引起的,当我使用 setImageResource

android.content.res.Resources$NotFoundException: File res/drawable/ic_mylib_offline_tracks_32.xml from drawable resource ID #0x7f020414
        at android.content.res.Resources.loadDrawable(Resources.java:2141)
        at android.content.res.Resources.getDrawable(Resources.java:711)
        at android.support.v7.widget.VectorEnabledTintResources.superGetDrawable(VectorEnabledTintResources.java:74)
        at android.support.v7.widget.AppCompatDrawableManager.onDrawableLoadedFromResources(AppCompatDrawableManager.java:433)
        at android.support.v7.widget.VectorEnabledTintResources.getDrawable(VectorEnabledTintResources.java:67)
        at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:360)
        at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:198)
        at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:186)
        at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100)
        at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:85)
        at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:93)
...

码:

@override
protected void onBindItemViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    ...    
    viewHoler.imageView.setImageResource(vectorResId);
    ...
}

矢量drawable - ic_mylib_offline_tracks_32.xml

<vector android:height="24dp" android:viewportHeight="32.0"
    android:viewportWidth="32.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#00000000" android:fillType="evenOdd"
        android:pathData="M7,21v3.75c0,0.69 0.54,1.25 1.2,1.25h15.6c0.66,0 1.2,-0.56 1.2,-1.25V21M19,17l-3,2 -3,-2M16,6v12"
        android:strokeColor="#A0A098" android:strokeLineCap="round"
        android:strokeLineJoin="round" android:strokeWidth="1"/>
</vector>

当我刷新工具栏菜单可见性时,由 android.content.res.Resources$NotFoundException: File res/drawable/ic_more_white_24.xml from drawable resource ID #0x7f020357. If the resource you are trying to use is a vector resource, you may be referencing it in an unsupported way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info. 引起的其他 .

android.content.res.Resources$NotFoundException: File res/drawable/ic_more_white_24.xml from drawable resource ID #0x7f020357. If the resource you are trying to use is a vector resource, you may be referencing it in an unsupported way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info.
        at android.content.res.Resources.loadDrawable(Resources.java:2096)
        at android.content.res.Resources.getDrawable(Resources.java:700)
        at android.support.v7.widget.VectorEnabledTintResources.superGetDrawable(VectorEnabledTintResources.java:74)
        at android.support.v7.widget.AppCompatDrawableManager.onDrawableLoadedFromResources(AppCompatDrawableManager.java:435)
        at android.support.v7.widget.VectorEnabledTintResources.getDrawable(VectorEnabledTintResources.java:67)
        at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:353)
        at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:200)
        at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:188)
        at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100)
        at android.support.v7.view.menu.MenuItemImpl.getIcon(MenuItemImpl.java:491)
        at android.support.v7.view.menu.ActionMenuItemView.initialize(ActionMenuItemView.java:125)
        at android.support.v7.widget.ActionMenuPresenter.bindItemView(ActionMenuPresenter.java:210)
        at android.support.v7.view.menu.BaseMenuPresenter.getItemView(BaseMenuPresenter.java:187)
        at android.support.v7.widget.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:196)
        at android.support.v7.widget.ActionMenuPresenter.flagActionItems(ActionMenuPresenter.java:476)
        at android.support.v7.view.menu.MenuBuilder.flagActionItems(MenuBuilder.java:1164)
        at android.support.v7.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:95)
        at android.support.v7.widget.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:229)
        at android.support.v7.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:291)
        at android.support.v7.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:1051)
        at android.support.v7.view.menu.MenuBuilder.onItemVisibleChanged(MenuBuilder.java:1090)
        at android.support.v7.view.menu.MenuItemImpl.setVisible(MenuItemImpl.java:651)
...

码:

public void refreshMenuItemVisibility(boolean visibility) {
    toolbar.getMenu().findItem(R.id.menu_overflow).setVisible(visible);
}

矢量drawable - ic_more_white_24.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="32dp"
    android:height="32dp"
    android:viewportWidth="32.0"
    android:viewportHeight="32.0">
    <path
        android:pathData="M10.5,16.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
        android:fillType="evenOdd"
        android:fillColor="#FFFFFF"/>
    <path
        android:pathData="M16.5,16.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
        android:fillType="evenOdd"
        android:fillColor="#FFFFFF"/>
    <path
        android:pathData="M22.5,16.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
        android:fillType="evenOdd"
        android:fillColor="#FFFFFF"/>
</vector>

我已经按照官方文档中的步骤进行了操作,但它不起作用 .

vectorDrawables.useSupportLibrary = true


public class MainActivity extends AppCompatActivity {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
}

我的库和工具版本如下:

  • Android支持库:26.0.0

  • 构建工具:26.0.0

  • Gradle:3.3

  • Android插件:2.3.3

更新

所有向量都放在 drawable 文件夹中 .

2 回答

  • 0

    您需要修复几件事 .

    1)首先将您的矢量图像放在 drawable 文件夹而不是 drawable-v24.

    2)还在 gradle 文件中添加对 vector drawables 的支持 .

    android {
         defaultConfig {
    
            vectorDrawables.useSupportLibrary = true
        }
    

    3)还有一个解决方法 . 在drawable文件夹中创建一个资源文件并执行以下操作:

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/Vector drawable"/>
    </layer-list>
    
  • -1

    试试这个,看看是否有效 .

    对我而言,我正在使用支持库23.4.0:

    将其添加到build.gradle

    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    

    将以下内容添加到Application类的onCreate中

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    

    对于要在其中设置矢量可绘制替换的所有xml视图

    android:src
    

    app:srcCompat
    

    并在代码中替换为:

    imageView.setImageResource(...);
    

    imageView.setImageDrawable(...);
    

相关问题