Использование библиотеки поддержки Android 23.2 в приложении build.gradle crashes (исключение XmlPullParserException: исключение XmlPullParserException: недопустимый вектор ярлыка)

Приложение прекрасно работает при использовании плагина поддержки v23.1.1 и работает под Android 4.4.4 (API 19):

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:support-v4:23.1.1'

однако, когда я его создаю, используя более новую версию (23.2) в библиотеке поддержки Android, она сбой:

XmlPullParserException: Binary XML file line #17: invalid drawable tag vector

Это происходит, когда приложение хочет раздуть диалоговое окно с простым пользовательским представлением. Пользовательский вид использует XML файл, содержащий тег <shape> как один из его доступных.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >

<solid
    android:color="@android:color/white" >
</solid>

<corners
    android:radius="5dp">
</corners>

<stroke android:width="1dp" android:color="@color/AppColor" />

</shape> 

Хотя я не могу точно определить этот SVG-код, который можно использовать в журналах сбоев, но я предполагаю, что с тех пор, как Google представила поддержку VectorDrawables, она каким-то образом сталкивается с моим приложением.

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

Ответ 1

Оказалось, что есть два отдельных вопроса:

  • Я использовал простой RadioButton в своих XML файлах. Изменение его на android.support.v7.widget.AppCompatRadioButton устранило проблему.
  • Во-вторых, поскольку сообщение в блоге предполагало, что мне пришлось переносить некоторые из выделенных объектов в контейнер, чтобы библиотека поддержки могла использовать их при создании векторного чертежа. Например, в одной из моих пользовательских кнопок у меня был вектор, основанный на векторе, сохраненный в dialog_bg.xml, button_round_bg.xml и button_round_bg_2.xml.

    Чтобы исправить это, я должен был поместить их в один из контейнеров (например, Список состояний, Inset или LevelList). Эта оболочка была сохранена в файле с именем vector_wrapper.xlm:

<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/dialog_bg"
        android:maxLevel="1"
        android:minLevel="1" />
    <item
        android:drawable="@drawable/button_round_bg"
        android:maxLevel="2"
        android:minLevel="2" />
    <item
        android:drawable="@drawable/button_round_bg_2"
        android:maxLevel="3"
        android:minLevel="3" />
</level-list>

Теперь я бы изменил свой собственный фон кнопки, чтобы сказать

<customButton
    android:background="@drawable/vector_wrapper"
</customButton>

Так как обертка теперь имеет три ярлыка, я могу выбрать их в коде Java в соответствии с моими потребностями:

customButton btnSave = (customButton) view.findViewById(R.id.btnSave);
btnSave.getBackground().setLevel(3);

Вам не нужно обертка контейнера, если ваше представление Image на основе вида другого ответа от @themichaelscott предполагает, что в этом случае просто измените src to app:srcCompat="@drawable/ic_add"

Ответ 2

У меня возникла аналогичная проблема. Я получал ту же ошибку, потому что я все еще использовал атрибут android: src вместо приложения: srcCompat при настройке источника моего ImageView

Изменение этого атрибута везде, где вы ссылаетесь на переносимый вектор, будет исправлять вашу проблему.

Старый:

<ImageView
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  android:src="@drawable/ic_add" />

Новое:

<ImageView
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add" />