Использование андроидных векторных ловушек при преломлении Lollipop

Я использую векторные чертежи в android до Lollipop, и это некоторые из моих библиотек и версий инструментов:

  • Android Studio: 2.0
  • Плагин для Android Gradle: 2.0.0
  • Инструменты для сборки: 23.0.2
  • Библиотека поддержки Android: 23.3.0

Я добавил это свойство на моем уровне приложения Build.Gradle

 android { defaultConfig { vectorDrawables.useSupportLibrary = true } } 

Также стоит упомянуть, что я использую дополнительный drawable, такой как LayerDrawable (layer_list), как указано в официальном блоге Android ( ссылка здесь ) для установки drawables для векторных чертежей вне app:srcCompat

    

Вы найдете прямое обращение к векторным чертежам вне приложения: srcCompat провалится до Lollipop. Однако AppCompat поддерживает загрузку векторных чертежей, когда они ссылаются в другом контейнере-контейнере, таком как StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable и RotateDrawable. Используя эту косвенную направленность , вы можете использовать векторные чертежи в таких случаях, как атрибут android: drawableLeft для TextView, который обычно не может поддерживать векторные чертежи.

Когда я использую app:srcCompat все работает нормально, но когда я использую:

 android:background android:drawableLeft android:drawableRight android:drawableTop android:drawableBottom 

на ImageView , ImageButton , TextView или EditText до Lollipop, он выдает искушение:

 Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9 

Я думаю, что это происходит, потому что поддержка Vector была отключена в последней версии библиотеки: 23.3.0

Согласно этому POST :

Для пользователей AppCompat мы решили удалить функциональные возможности, которые позволяют использовать векторные чертежи из ресурсов на устройствах, предшествующих Lollipop, из-за проблем, обнаруженных в реализации в версии 23.2.0 / 23.2.1 (ISSUE 205236) . Использование приложения: srcCompat и setImageResource () продолжают работать.

Если вы посетите выпуск ISSUE 205236 , кажется, что они будут включены в будущем, но проблема с памятью скоро не будет исправлена:

В следующем выпуске я добавил API-интерфейс, в котором вы можете снова включить поддержку VectorDrawable, которая была удалена. Он поставляется с теми же предостережениями, что и раньше (использование памяти и проблемы с обновлением конфигурации).

У меня была аналогичная проблема. Таким образом, в моем случае я снова вернул все значки, которые снова используют вектор, переносимый из ресурса в PNG-изображения (поскольку проблема с памятью будет продолжаться, даже после того, как они предоставят возможность включить ее снова).

Я не уверен, что это лучший вариант, но он исправляет все сбои, на мой взгляд.

ОБНОВИТЬ

Они снова включили VectorDrawable в
Android Support Library 23.4.0

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

Возможно , настройка build.gradle теперь устарела, и вам просто нужно включить ее в правильные действия (однако, нужно протестировать).

Теперь, чтобы включить его, вы должны сделать:

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

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

VectorDrawable cheatsheet

У меня такая же проблема. Но, выполняя много исследований и разработок, я получил ответ.

Для Imageview и ImageButton используйте приложение: srcCompat = “@ drawable / ….”, а для других видов, таких как Button, Textview, вместо использования «drawableLeft / right …» в XML, укажите программные возможности drawables как:

 button.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(mContext,R.drawable.ic_share_brown_18dp), null, null, null); 

И используйте «AppCompatResources», чтобы получить ansible.

Ответ от Guillherme P довольно удивительный. Чтобы сделать небольшое улучшение, вам не нужно добавлять эту строку в каждое действие, если вы добавили ее один раз в class Application, она также будет работать.

 public class App extends Application { static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } 

ПОМНИТЕ: Вам все равно необходимо включить поддержку библиотеки поддержки в gradleиенте:

 android { defaultConfig { vectorDrawables.useSupportLibrary = true } } 

Кроме того, убедитесь, что вы используете версию библиотеки поддержки больше, чем v23.4, когда Google добавила поддержку Drawable Containers для VectorDrawables ( примечание к выпуску )

ПРИМЕЧАНИЕ . В любом случае, я предлагаю использовать PNG до тех пор, пока Google не придумает лучшее исправление или у вас могут возникнуть проблемы с памятью.

VectorDrawables на pre-lollipop должны работать нормально, не используя

 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 

Если вы хотите использовать VectorDrawables внутри ImageViews, вы можете использовать атрибут srcCompat и он будет работать, но внутри кнопок или TextViews этого не будет , поэтому вам нужно обернуть Drawable в InsetDrawable или LayerDrawable. Существует еще один трюк, который я обнаружил, если вы используете привязку данных, вы можете сделать это:

 android:drawableLeft="@{@drawable/vector_ic_access_time_24px}" android:drawableStart="@{@drawable/vector_ic_access_time_24px}" 

Это будет волшебно работать, я не исследовал, что происходит за кулисами, но я думаю, что TextView использует метод getDrawable из AppCompatResources или аналогичного.

У меня такая же проблема. И исправить это, удалив

 vectorDrawables.useSupportLibrary = true 

Моя целевая версия – 25, а поддержка библиотеки –

  compile 'com.android.support:appcompat-v7:25.3.1' 

Для тех, кто обновляется до android gradle 3.0 и выше, нет необходимости использовать AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) или установить vectorDrawables.useSupportLibrary = true (добавьте это приведет к возникновению проблемы) и использовать app:srcCompat , он просто работает.

Возьмите меня два дня, чтобы понять это, и не находите какие-либо связанные документы в документах Google …

Я использую VectorDrawables на устройствах Pre-lollipop, и так я это делаю:

Шаг 1: Поместите это в gradleиент уровня приложения.

 android { defaultConfig { vectorDrawables.useSupportLibrary = true } } 

Шаг 2:

Поместите это в свой class Application и не забудьте зарегистрировать свой class Application в файле манифеста.

 public class App extends Application { static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } } 

Шаг 3:

Получите VectorDrawables, используя,

 imageView.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.my_vector_drawable)); 

Лоты R & D, наконец, получили это решение для сбоев на устройствах с предварительным леоптипом.

Для просмотра изображений

  • использовать приложение: srcCompat вместо android: src

Для TextView / EditText

  • Удалите drawableleft , drawableright …. и установите из кода java.

txtview.setCompoundDrawablesWithIntrinsicBounds (AppCompatResources.getDrawable (EventDetailSinglePage.this, R.drawable.ic_done_black_24_n), null, null, null);

Для Build.gradle

vectorDrawables.useSupportLibrary = true

Предложение Гильерме П не работало для меня. Я пошел вперед и принял решение использовать png, где мне нужно делать что-то вне приложения: srcCompat, т. Е. DrawableLeft, drawableRight и т. Д. Это было довольно простое изменение, и оно не имеет потенциальных проблем с памятью. AppCompatDelegate.setCompatVectorFromResourcesEnabled ( правда); вводит.

Теперь есть более простое решение, просто используйте приложение: drawableRightCompat из пространства имен приложений.

Или в стиле:

  

Альтернативой ответу Бенни является создание суперclassа Activity :

 public abstract class VectorDrawableActivity extends AppCompatActivity { static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } //... } 

Теперь расширяем VectorDrawableActivity вместо AppCompatActivity .

Давайте будем гением компьютера.