Подтвердить что ты не робот

AppCompat 23.3 Поддержка векторов больше не работает?

Я использовал вспомогательные векторные элементы, добавленные в Support Library 23.2 вместе с AppCompat. Я использовал векторные чертежи как с app:srcCompat, так и внутри StateListDrawable, поэтому я мог использовать их с android:drawableLeft для моего TextView.

С момента перехода на версию AppCompat версии 23.3.0 работают только векторы в app:srcCompat. Всякий раз, когда я ссылаюсь на него другим способом, я получаю

FATAL EXCEPTION: main
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.package.name/.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class Button
 ...
 Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class Button
 ...
 Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #14: invalid drawable tag vector
  at android.graphics.d

Что изменилось, что в настоящее время приводит к тому, что мои векторные векторные элементы поддержки не сработают?

4b9b3361

Ответ 1

Обновление: Они снова включаются в библиотеку поддержки 23:

Для пользователей AppCompat weve добавила API-интерфейс для повторного включения поддержки векторных чертежей из ресурсов (поведение, описанное в 23.2), через AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - Имейте в виду, что это все еще может вызвать проблемы с использованием памяти и проблемы с обновлением экземпляров Configuration, поэтому почему это отключено по умолчанию.

Отметьте эту ссылку: 23.4.0 доступно сейчас
-------------------------------------------------- ---------

В соответствии с объявлением о выпуске для Android Support Library 23.3:

Для пользователей AppCompat мы решили удалить функциональные возможности, которые позволяют использовать векторные чертежи из ресурсов на устройствах, предшествующих Lollipop, из-за проблем, обнаруженных в реализации в версии 23.2.0/23.2.1 [https://code.google.com/p/android/issues/detail?id=205236, https://code.google.com/p/android/issues/detail?id=204708]. Использование app:srcCompat и setImageResource() продолжает работать.

Итак, это ожидаемое изменение поведения. Вам нужно будет использовать не-векторную графику для любого случая, который не обрабатывается srcCompat.

Если вы хотите продолжать использовать векторы до API 21, вы можете удалить строку

vectorDrawables.useSupportLibrary = true

(или эквивалент, если вы используете плагин 1.5 Gradle, как показано в сообщении 23.2 в блоге).

Это заставит Android Studio генерировать PNG во время компиляции приложений с minSdkVersion, меньшим, чем API 21, при использовании ваших векторов на устройствах API 21+, позволяя сохранить тот же код, что и с 23.2.1 за счет дополнительных Размер APK.

Ответ 2

Поддержка VectorDrawable для pre-Lollipop была добавлена ​​в библиотеку поддержки 23.2.0, а затем частично удалена в 23.3.0. В 23.4.0 и выше (не менее 25.1.0) эта удаленная часть возвращается, но за необязательным флагом (потому что она имеет цену).

Подводя итог: в библиотеке поддержки 23.4.0 по крайней мере до 25.1.0, вы можете заставить VectorDrawable работать в некоторых случаях.

Я сделал эту диаграмму, чтобы помочь.

VectorDrawable cheatsheet

Ответ 3

Чтобы использовать векторы как составные изображения (например, для текстового просмотра) без использования

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

что приводит к документированному использованию большой памяти, просто надуйте вектор, используя

Drawable drawable = AppCompatResources.getDrawable( getContext(), R.drawable.vector_resID );
if( drawable != null ) drawable.setBounds( 0, 0, iconSize, iconSize );
TextViewCompat.setCompoundDrawablesRelative( textView, null, null, drawable, null);

Так работает navDrawer