Cuando uso los recursos de VectorDrawable en una vista de texto o una vista de imagen, obtengo un bloqueo en tiempo de ejecución al usar "android: DrawableRight" / "android: DrawableEnd" / "android: DrawableStart" / "android: DrawableLeft".
La aplicación se compilará bien sin advertencias.
estoy usando
- Gradle 1.5
- Biblioteca de soporte 23.2 ('com.android.support:appcompat-v7:23.2.0')
Sin embargo, lo que he encontrado es que puedo asignar SVG programáticamente en Java sin fallas como esta.
TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);
(Sospecho que este es un error de la biblioteca de soporte para 23.2.)
¿Pero es posible usar drawableRight, etc. para los activos de SVG?
Aquí está mi diseño
<?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>
Aquí está mi actividad
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);
}
}
Aquí está el activo VectorDrawable no modificado del sitio de diseño de materiales de 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>
Aquí está mi aplicación 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'
}
Aquí está el choque. (Tenga en cuenta los errores de inflado que hacen referencia a la vista de texto).
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)
...
Respuestas:
si
AppCompatTextView ahora soportes
app:drawableLeftCompat
,app:drawableTopCompat
,app:drawableRightCompat
,app:drawableBottomCompat
,app:drawableStartCompat
yapp:drawableEndCompat
dibujables compuestos, apoyando portado tipos estirables tales comoVectorDrawableCompat
.Incluya esto en su archivo gradle
En su vista de texto puede usar
Si tiene problemas al usar la aplicación: drawableLeftCompat, app: drawableStartCompat en los botones, deberá actualizar su biblioteca a
androidx.appcompat: appcompat: 1.2.0-alpha01
tenían un error
androidx.appcompat: appcompat: 1.1.0-alpha01
puedes ver los documentos
O si aún no desea actualizar, entonces:
Debido a que parece que Google no va a hacer nada al respecto en el corto plazo, tuve que encontrar una solución reutilizable más sólida para todas mis aplicaciones:
Primero agregue atributos personalizados de TextView en el archivo attrs.xml de su aplicación "res / values / attrs.xml" :
Luego cree una clase TextView personalizada como esta:
Ahora puede usarlo fácilmente en cualquier diseño según sus atributos personalizados:
Espero que esto ayude :)
fuente
vectorDrawables { useSupportLibrary = true }
de mibuild.gradle
como esa respuesta sugiere funcionó para mí.vectorDrawables useSupportLibrary = true
línea de la gradle. Cuando lo eliminas, aún puedes poner vectores dentro de tus vistas, pero cambian de tamaño de la misma manera que pngs, lo que significa que se estirarán y se volverán granulados. Si desea que los dispositivos por debajo de 5.0 / API21 cambien el tamaño de los vectores correctamente para que se vean nítidos, debe usar esa línea dentro del archivo gradle. Poner esa línea invoca el IDE para encontrar áreas en las que está utilizando vectores incorrectamente y luego debe usar elapp:srcCompat
código XML o configurarlo a través del código conVectorDrawableCompat.create()
app:drawableEndCompat
para un mejor soporte RTL? CausasetCompoundDrawablesRelativeWithIntrinsicBounds
necesita API nivel 17 al menos.Esta solución ya no es correcta. A partir de la versión 23.3.0, los dibujos vectoriales solo se pueden cargar a través de la aplicación: srcCompat o setImageResource ()
Intente ajustar su vector dibujable en lista de capas o selector:
ic_accessible_white_wrapped.xml:
fuente
La mejor manera que encontré:
fuente
Drawable drawable = VectorDrawableCompat.create(getResources(), status.getIconResId(), wrapper.getTheme()); statusButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, drawable, null, null);
setCompoundDrawablesWithIntrinsicBounds
es 17 . De lo contrario, esto funciona muy bien.Para complementar algunas de las respuestas aquí: puede hacer que VectorDrawable funcione como
drawableLeft
(etc.) pero depende de la versión de la Biblioteca de soporte y tiene un precio.¿En qué casos funciona? He creado este diagrama para ayudar (válido para Support Library 23.4.0 a - al menos - 25.1.0).
fuente
setCompatVectorFromResourcesEnabled
From 23.3.0 version vector drawables can only be loaded via app:srcCompat or setImageResource()
por lo que esta solución está en desuso y no funcionarásetCompatVectorFromSourcesEnabled(true)
permite cargar vectores dibujables enandroid:background
Android 4.x. ¡Así que gracias! (Ninguna de las otras respuestas funcionó, así es como agregué una
VectorDrawable
aTextView
, debe usarlaVectorDrawableCompat.create()
al tratar aVectorDrawables
continuaciónAndroid L
:¡Corto, dulce y al punto!
fuente
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
fuente
Es posible establecer directamente dibujos vectoriales en xml, pero debe incluir el marco de enlace de datos.
Solo escribe
y envuelva todo su diseño en una
<layout>
etiqueta, por lo que básicamente su xml se vería así:Para activar el marco de enlace de datos simplemente agregue
No tiene que usar ninguna otra característica de la biblioteca de enlace
EDITAR:
Por supuesto, si desea usar dibujos vectoriales dibujables antes de Lollipop, debe habilitar el soporte de dibujos vectoriales usando
vectorDrawables.useSupportLibrary = true
Por lo tanto,
build.gradle
necesita 2 nuevos comandos:gracias a rkmax por el comentario
fuente
vectorDrawables.useSupportLibrary
en app / build.gradle y también agregar AppCompatDelegate.setCompatVectorFromResourcesEnabled (verdadero) en la actividadbuild.gradle
que podría ser la razón por la que no está funcionandoRevisé todas las respuestas y utilicé la última versión de Android Studio 3.0.1 y AppCompat Support Library 26.1.0. Puedo asegurar que esto funciona bien.
En el archivo build.gradle (aplicación)
Y en la extensión de actividad,
AppcompatActivity
incluya estos métodos externos, es decir, unstatic
bloqueo si desea que esto se aplique a toda la aplicación, simplemente incluya esta línea dentro de la clase que extiende la
Application
claseVista de texto en xml
account_drawableleft_selector.xml
fuente
drawableRight
paraTextView
en XML?A partir de androidx.appcompat: appcompat: 1.1.0 puede usar
fuente
Llegué tan tarde a responder esta pregunta que me atrapé tarde con este problema. Tuve el mismo problema con svg / vector drawables con TextView. En lugar de hacer su propio dibujo personalizado, puedo solucionar mi problema con 2 líneas de código de la siguiente manera:
Espero que te ayude.
fuente
L
dispositivos previos .VectorDrawables
todos los dispositivos que ejecutan pre-L, solo digo. Tenga cuidado al usar esta respuesta, ya que hay API más seguras y precisas para usar.He diseñado una pequeña biblioteca para esto: textview-rich-drawable (también admite la definición del tamaño y el tinte de los dibujables compuestos).
Y la dependencia
fuente
Si está utilizando enlace, hay otra forma mágica de tener el mismo enfoque para usar vectores en un TextView. Envolviéndolos como:
Eso funcionará mágicamente, no he investigado lo que sucede detrás de escena, pero supongo que TextView está utilizando el
getDrawable
método deAppCompatResources
o similar.fuente
Basado en la respuesta de Behzad Bahmanyar , noté que no podía usar los atributos normales de Android para archivos PNG normales:
porque sería reemplazado por nulo en
si
app:drawableTopCompat
no se configuró, peroandroid:drawableTop
(por ej.).Aquí está la solución completa:
fuente
En el archivo build.gradle (aplicación)
...
uso (cuando enlace de datos)
O (normal)
fuente
Uso de Vector Drawables
Kotlin
Java
fuente
Para compatibilidad con versiones anteriores, use:
fuente
Estoy usando un adaptador de enlace para resolver este problema
y también usar de esta manera en mi diseño
probablemente vectorDrawables.useSupportLibrary = true en la configuración predeterminada es necesario
fuente