сбой рисования вектора на пред-леденце - PullRequest
0 голосов
/ 27 апреля 2018

Я обнаружил, что на устройствах, предшествующих Lollipop, происходило множество сбоев с векторной графикой, и я не могу их воспроизвести.

Одна из них вызвана org.xmlpull.v1.XmlPullParserException: строка двоичного XML-файла # 1: недопустимый нарисованный вектор тега при использовании 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);
    ...
}

Вектор для рисования - 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: файл res / drawable / ic_more_white_24.xml из идентификатора нарисованного ресурса # 0x7f020357. Если ресурс, который вы пытаетесь использовать, является векторным ресурсом, вы можете ссылаться на него неподдерживаемым способом. См. AppCompatDelegate.setCompatVectorFromResourcesEnabled () для получения дополнительной информации. при обновлении видимости меню панели инструментов.

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);
}

Вектор для рисования - 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

UPDATE

Все векторы помещаются в папку drawable.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Попробуйте и посмотрите, работает или нет.

Для меня это работает, так как я использую библиотеку поддержки 23.4.0:

Добавить это в build.gradle

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

Добавьте следующее в onCreate класса вашего приложения

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

Для всех представлений XML, в которых вы устанавливаете векторное изображение, замените

android:src

с

app:srcCompat

и в коде заменить это:

imageView.setImageResource(...);

с

imageView.setImageDrawable(...);
0 голосов
/ 27 апреля 2018

Есть пара вещей, которые нужно исправить.

1) Сначала поместите векторное изображение в папку drawable вместо drawable-v24.

2) Также добавьте поддержку vector drawables в gradle файле.

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>
...