Использование библиотеки поддержки 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" />