VectorDrawable Resources $ NotFoundException, в то время как xml векторный файл ресурсов для рисования существует - PullRequest
0 голосов
/ 03 мая 2019

Мин. SDK моего приложения - 21, поэтому добавлять его не нужно

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

к классу приложения, так как его значение меньше 21 (в любом случае я пытался добавить его безрезультатно).
Мой файл конфигурации build.gradle имеет

defaultConfig {vectorDrawables.useSupportLibrary = true}

настройка и не включены proguard / minify

    debuggable true
    crunchPngs false
    minifyEnabled false
    shrinkResources false

    splits.abi.enable false
    splits.density.enable false

В любом случае я проверил скомпилированный файл .apk с помощью AndroidStudio и убедился, что все мои векторные рисунки действительно присутствуют в папке res / drawable, поэтому это не proguard / shrinker или что-то подобное.
Также я должен отметить, что я использую androidx вместо support в этом проекте.
Итак, я перепробовал все возможные варианты настройки изображения:

setImageResource(imgResId);
setImageDrawable(ContextCompat.getDrawable(context, imgResId));
setImageDrawable(AppCompatResources.getDrawable(context, imgResId));
setImageDrawable(VectorDrawableCompat.createFromResource(resources, imgResId));
setImageDrawable(VectorDrawableCompat.create(resources, imgResId, null));
setImageDrawable(ResourcesCompat.getDrawable(resources, imgResId, null));

безрезультатно (фактически результатом всегда был сбой приложения). Отправка реального Theme вместо null тоже не помогла.
Это обычный PagerAdapter, и для векторных динамически выводимых изображений устанавливаются соответствующие ImageView на каждой странице динамически, так что это не тот случай статического xml android:src="@drawable\ic_img", когда вы должны (но не должны) заменить его на app:srcCompat="@drawable\ic_img".
И я также попытался обернуть изображение в селектор, как:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/vector_image" />
</selector>

но не повезло - отчет о сбое немного меняется, но, в конце концов, приводит к тому же исключению.
Ничто не помогло мне из этого SO вопроса и любых других SO вопросов, которые я также нашел.
Мои векторные объекты используют градиент, который работает только начиная с API 24. Я тестирую свое приложение на устройстве API 26, но попытался заменить все градиенты, добавив android:fillColor в раздел path и комментируя раздел градиента, например:

<path
    android:pathData="M268.177,..."
    android:strokeWidth="1"
    android:fillType="nonZero"
    android:strokeColor="#00000000"
    android:fillColor="#FFEF5E32">
    <!--<aapt:attr name="android:fillColor">-->
        <!--<gradient-->
            <!--android:startY="84.70677"-->
            <!--android:startX="284.02185"-->
            <!--android:endY="70.083954"-->
            <!--android:endX="252.21419"-->
            <!--android:type="linear">-->
            <!--<item android:offset="0" android:color="#FFEF5E32"/>-->
            <!--<item android:offset="1" android:color="#FFF68F32"/>-->
        <!--</gradient>-->
    <!--</aapt:attr>-->
</path>

И не повезло ...
Я понимаю, что импорт моих векторов в png / webp, скорее всего, решит проблему, но я хочу использовать векторные рисунки.

1 Ответ

0 голосов
/ 03 мая 2019

Когда я применял патч для градиентных секций, я заметил, что AndroidStudio выделил эти градиентные секции, сказав, что он поддерживается из API 24, а мой проект min API равен 21. Поэтому я решил проверить другие предупреждения, такие как:

Очень длинный векторный путь (1456 символов), что плохо сказывается на производительности.Учитывая снижение точности, удаление мелких деталей или растеризацию вектора.

Поэтому я начал подозревать, что это источник проблемы, потому что в окне сборки AndroidStudio появилось сообщение об ошибке (красный цвет), в котором говорится:

слишком большая строка для кодирования с использованием UTF-8, записанного вместо этого как «STRING_TOO_LARGE».

Но нет ни клея, ни указания на источник этой проблемы, она просто заявляетчто у меня есть очень длинная строка где-то в моем проекте, так что это может быть, например, предварительно загруженный файл базы данных области или что-то в этом роде.
Наконец, я обнаружил аномалию в одном из моих векторных отрисовок - это была строка пути, содержащая около 51 тыс. символов!Конечно, при импорте я не получил никакого предупреждения (svg to xml, сделано с помощью AndroidStudio).
Удаление этого пути решило проблему сбоя, но также была потеряна часть изображения.
Итак, я разгруппировалгруппа проблемных путей с использованием Sketch, и после импорта она привела к двум путям из 19k и 24k символов, что тоже не хорошо, но теперь работает без сбоев.
btw Я не могу найти какую-либо информацию об ограничениях длины строки для вектора/ xml, но gradle действительно применяет это ограничение во время сборки, поэтому оно известно.

Image displays AndroidStudio warning and compile error

Предел длины одной строки XML, указанный в этом вопросе SO , и официального документа по этому вопросу не найдено.

...