Когда я использую ресурсы VectorDrawable в текстовом или графическом представлении, я получаю сбой во время выполнения при использовании "android: DrawableRight" / "android: DrawableEnd" / "android: DrawableStart" / "android: DrawableLeft".
Приложение скомпилируется без каких-либо предупреждений.
Я использую
- Gradle 1.5
- Библиотека поддержки 23.2 ('com.android.support:appcompat-v7:23.2.0')
Однако я обнаружил, что могу программно назначать SVG в Java без сбоев, подобных этому.
TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);
(Я подозреваю, что это ошибка библиотеки поддержки для 23.2.)
Но можно ли использовать drawableRight и т. Д. Для ресурсов SVG?
Вот мой макет
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="au.com.angryitguy.testsvg.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="@drawable/ic_accessible_white_36px"
android:background="@color/colorPrimary"
android:textColor="#FFFFFF"
android:textSize="22sp"
android:text="Hello World!"/>
</RelativeLayout>
Вот моя активность
package au.com.angryitguy.testsvg;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Вот немодифицированный ресурс VectorDrawable с сайта материального дизайна Google.
<vector android:height="24dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"/>
<path android:fillColor="#FFFFFF" android:pathData="M19,13v-2c-1.54,0.02 -3.09,-0.75 -4.07,-1.83l-1.29,-1.43c-0.17,-0.19 -0.38,-0.34 -0.61,-0.45 -0.01,0 -0.01,-0.01 -0.02,-0.01L13,7.28c-0.35,-0.2 -0.75,-0.3 -1.19,-0.26C10.76,7.11 10,8.04 10,9.09L10,15c0,1.1 0.9,2 2,2h5v5h2v-5.5c0,-1.1 -0.9,-2 -2,-2h-3v-3.45c1.29,1.07 3.25,1.94 5,1.95zM12.83,18c-0.41,1.16 -1.52,2 -2.83,2 -1.66,0 -3,-1.34 -3,-3 0,-1.31 0.84,-2.41 2,-2.83L9,12.1c-2.28,0.46 -4,2.48 -4,4.9 0,2.76 2.24,5 5,5 2.42,0 4.44,-1.72 4.9,-4h-2.07z"/>
</vector>
Вот мое приложение build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "au.com.angryitguy.testsvg"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
// Stops the Gradle plugin’s automatic rasterization of vectors
generatedDensities = []
}
// Flag to tell aapt to keep the attribute ids around
aaptOptions {
additionalParameters "--no-version-vectors"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
}
Вот авария. (Обратите внимание на ошибки inflate, которые ссылаются на текстовое представление.)
java.lang.RuntimeException: Unable to start activity ComponentInfo{
au.com.angryitguy.testsvg/au.com.angryitguy.testsvg.MainActivity}:
android.view.InflateException: Binary XML file line #13:
Error inflating class TextView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
...
Caused by: android.view.InflateException:
Binary XML file line #13: Error inflating class TextView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...
Caused by: android.content.res.Resources$NotFoundException:
File res/drawable/ic_accessible_white_36px.xml from drawable resource ID #0x7f02004b
at android.content.res.Resources.loadDrawable(Resources.java:1918)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
at android.widget.TextView.<init>(TextView.java:622)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:60)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:56)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...
Caused by: org.xmlpull.v1.XmlPullParserException:
Binary XML file line #1: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818)
at android.content.res.Resources.loadDrawable(Resources.java:1915)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
at android.widget.TextView.<init>(TextView.java:622)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:60)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:56)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...
Ответы:
да
AppCompatTextView Теперь опоры
app:drawableLeftCompat
,app:drawableTopCompat
,app:drawableRightCompat
,app:drawableBottomCompat
,app:drawableStartCompat
иapp:drawableEndCompat
соединение, поддерживая вводимый коэффициент портированного Drawable типов , такие какVectorDrawableCompat
.Включите это в свой файл Gradle
В текстовом представлении вы можете использовать
Если у вас возникли проблемы при использовании app: drawableLeftCompat, app: drawableStartCompat в кнопках, вам необходимо обновить вашу библиотеку до
androidx.appcompat: AppCompat: 1.2.0-alpha01
у них была ошибка на
androidx.appcompat: AppCompat: 1.1.0-alpha01
вы можете увидеть документы
Или, если вы еще не хотите обновляться, то:
Поскольку похоже, что Google не собирается в ближайшее время ничего делать с этой проблемой, мне пришлось придумать более надежное решение многократного использования для всех моих приложений:
Сначала добавьте настраиваемые атрибуты TextView в файл attrs.xml вашего приложения «res / values / attrs.xml» :
Затем создайте собственный класс TextView следующим образом:
Теперь вы можете легко использовать его в любых макетах по своим настраиваемым атрибутам:
Надеюсь это поможет :)
источник
vectorDrawables { useSupportLibrary = true }
из моего,build.gradle
как предполагает этот ответ, сработало для меня.vectorDrawables useSupportLibrary = true
строки из градиента. Когда вы удалите его, вы все равно сможете помещать векторы в свои представления, но они изменяют размер так же, как png, что означает, что они будут растянуты и станут зернистыми. Если вы хотите, чтобы устройства ниже 5.0 / API21 действительно правильно изменяли размер векторов, чтобы они выглядели четкими, вы должны использовать эту строку внутри файла gradle. Ввод этой строки вызывает IDE для поиска областей, в которых вы неправильно используете векторы, а затем вы должны использоватьapp:srcCompat
через XML или установить его через код с помощьюVectorDrawableCompat.create()
app:drawableEndCompat
для лучшей поддержки RTL? ПричинаsetCompoundDrawablesRelativeWithIntrinsicBounds
требует API уровня не ниже 17.Это решение уже неверно. Начиная с версии 23.3.0 векторные чертежи можно загружать только через app: srcCompat или setImageResource ()
Попробуйте обернуть свой вектор, который можно рисовать, в список слоев или селектор:
ic_accessible_white_wrapped.xml:
источник
Лучший способ, который я нашел:
источник
Drawable drawable = VectorDrawableCompat.create(getResources(), status.getIconResId(), wrapper.getTheme()); statusButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, drawable, null, null);
setCompoundDrawablesWithIntrinsicBounds
равно 17 . В противном случае это отлично работает.Чтобы дополнить некоторые ответы здесь: вы можете заставить VectorDrawable работать как
drawableLeft
(и т. Д.), Но это зависит от версии библиотеки поддержки и имеет цену.В каких случаях это работает? Я сделал эту диаграмму, чтобы помочь (действительно для библиотеки поддержки от 23.4.0 до - как минимум - 25.1.0).
источник
setCompatVectorFromResourcesEnabled
From 23.3.0 version vector drawables can only be loaded via app:srcCompat or setImageResource()
поэтому это решение устарело и не будет работатьsetCompatVectorFromSourcesEnabled(true)
позволяет загружать векторные рисунки вandroid:background
Android 4.x. Так что спасибо! (Вам действительно нужно обернуть фактический вектор в один слой-список элементов)Ни один из других ответов не сработал, вот как я добавил
VectorDrawable
кTextView
, вы должны использоватьVectorDrawableCompat.create()
при работе сVectorDrawables
нижеAndroid L
:Коротко, мило и по делу!
источник
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
источник
Можно напрямую установить векторные чертежи в xml, но вы должны включить структуру привязки данных.
Просто пиши
и оберните весь макет в
<layout>
тег, так что в основном ваш xml будет выглядеть так:Чтобы активировать структуру привязки данных, просто добавьте
Вам не нужно использовать какие-либо другие функции библиотеки привязки
РЕДАКТИРОВАТЬ:
Конечно, если вы хотите использовать векторные чертежи до Lollipop, вам нужно включить поддержку векторных чертежей, используя
vectorDrawables.useSupportLibrary = true
Итак, вам
build.gradle
нужны 2 новые команды:спасибо rkmax за замечание
источник
vectorDrawables.useSupportLibrary
в app / build.gradle, а также добавить AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) в активностьbuild.gradle
это может быть причиной того, что он не работаетЯ просмотрел все ответы и, используя последнюю версию Android studio 3.0.1 и AppCompat Support Library 26.1.0, могу заверить, что это работает нормально.
В файле build.gradle (app)
И в расширение Activity включите
AppcompatActivity
эти внешние методы, т.е.static
блокили если вы хотите, чтобы это применялось ко всему приложению, просто включите эту строку внутри класса, расширяющего
Application
классПросмотр текста в xml
account_drawableleft_selector.xml
источник
drawableRight
forTextView
в XML?Начиная с androidx.appcompat: appcompat: 1.1.0 вы можете использовать
источник
Я так поздно отвечал на этот вопрос, потому что задержался с этой проблемой. У меня была такая же проблема с чертежами svg / vector с TextView. Вместо того, чтобы создавать свои собственные возможности рисования, я могу исправить свою проблему с помощью двух строк кода, как показано ниже:
Надеюсь, это поможет вам.
источник
L
устройствами.VectorDrawables
на всех устройствах, работающих под управлением pre-L, просто скажу. Будьте осторожны при использовании этого ответа, так как есть более безопасные и точные API.Я разработал для этого крошечную библиотеку - textview-rich-drawable (она также поддерживает определение размера и оттенка составных-drawables ).
И зависимость
источник
Если вы используете привязку, есть еще один волшебный способ применить тот же подход к использованию векторов в TextView. Заворачивая их так:
Это волшебным образом сработает, я не исследовал, что происходит за кулисами, но я предполагаю, что TextView использует
getDrawable
метод изAppCompatResources
или аналогичный.источник
Основываясь на ответе Бехзада Бахманьяра , я заметил, что не могу использовать обычные атрибуты Android для обычных файлов png:
потому что он будет заменен на null в
если
app:drawableTopCompat
не был установлен, ноandroid:drawableTop
было (например).Вот полное решение:
источник
В файле build.gradle (app)
...
использовать (При привязке данных)
Или (Нормальный)
источник
Использование векторных чертежей используйте
Котлин
Ява
источник
Для обратной совместимости используйте:
источник
Я использую адаптер привязки для решения этой проблемы
а также используя таким образом в моем макете
возможно vectorDrawables.useSupportLibrary = true в конфигурации по умолчанию необходим
источник