write solo significa quitar que protegido proteger modo lectura está escritura dibujo cómo contra archivo android vector android-support-library android-drawable android-compatibility

android - solo - proteger archivo autocad contra escritura



Uso de Drawables vectoriales de Android en el accidente previo a Lollipop (15)

Estoy usando vectores dibujables en Android antes de Lollipop y estos son de algunas de mis bibliotecas y versiones de herramientas:

  • Android Studio: 2.0
  • Complemento Android Gradle: 2.0.0
  • Herramientas de compilación: 23.0.2
  • Biblioteca de soporte de Android: 23.3.0

Build.Gradle esta propiedad en el nivel de mi aplicación Build.Gradle

android { defaultConfig { vectorDrawables.useSupportLibrary = true } }

También vale la pena mencionar que utilizo un extraíble como LayerDrawable (layer_list) como se indica en el Blog oficial de Android ( enlace aquí ) para configurar dibujos para vectores dibujables fuera de la app:srcCompat

<level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/search"/> </level-list>

Encontrará referencias directas a los dibujos vectoriales fuera de la aplicación: srcCompat fallará antes de Lollipop. Sin embargo, AppCompat admite la carga de dibujos vectoriales cuando se hace referencia a ellos en otro contenedor dibujable como StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable y RotateDrawable. Al usar esta indirección , puede usar dibujos vectoriales en casos como el atributo android: drawableLeft de TextView, que normalmente no podría admitir dibujos vectoriales.

Cuando estoy usando la app:srcCompat todo funciona bien, pero cuando uso:

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

en ImageView , ImageButton , TextView o EditText antes de Lollipop, arroja una expectativa:

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


Después de usar el siguiente código.

android { defaultConfig { vectorDrawables.useSupportLibrary = true } } public class App extends Application { static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }}

aún así, existe un problema de imágenes vectoriales para los siguientes atributos:

DrawableEnd, DrawableStart, DrawableTop, DrawableBottom, Background

En este caso, siga los pasos que se indican a continuación. En lugar de hacer referencia a la imagen del vector, utilice directamente la etiqueta del selector como un archivo de dibujo intermedio.

Ejemplo:

ic_warranty_icon.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="17dp" android:height="24dp" android:autoMirrored="true" android:viewportWidth="17" android:viewportHeight="24"> <path android:fillColor="#fff" android:pathData="M10.927,15.589l-1.549,0.355a7.47,7.47 0,0 1,-0.878 0.056c-4.136,0 -7.5,-3.364 -7.5,-7.5s3.364,-7.5 7.5,-7.5 7.5,3.364 7.5,7.5c0,3.286 -2.126,6.078 -5.073,7.089zM8.5,2a6.508,6.508 0,0 0,-6.5 6.5c0,3.583 2.917,6.5 6.5,6.5s6.5,-2.917 6.5,-6.5 -2.917,-6.5 -6.5,-6.5z" />

safe_ic_warranty_icon.xml

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_warranty_icon" /> </selector>

Su TextView / Diseño.

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableStart="@drawable/ic_warranty_icon" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/ic_warranty_icon" />


Estoy usando VectorDrawables en dispositivos Pre-lollipop y así es como lo hago: -

Paso 1: Pon esto en tu nivel de aplicación gradle.

android { defaultConfig { vectorDrawables.useSupportLibrary = true } }

Paso 2:

Ponga esto en su clase de aplicación y no olvide registrar su clase de aplicación en el archivo de manifiesto.

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

Paso 3:

Obtenga VectorDrawables usando,

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


Gran cantidad de I + D, finalmente obteniendo esta solución para fallas en dispositivos pre-lollipop.

Para Imageview

  • use app: srcCompat en lugar de android: src

Para TextView / EditText

  • Elimine drawableleft , drawableright .... y configúrelo desde el código java dibujable.

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

Para Build.gradle

vectorDrawables.useSupportLibrary = true


La respuesta de Guillherme P es bastante impresionante. Solo para hacer una pequeña mejora, no necesita agregar esa línea en cada actividad, si la agregó una vez en la clase Aplicación también funcionará.

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

RECUERDE: aún debe haber habilitado el uso de la biblioteca de soporte en gradle:

android { defaultConfig { vectorDrawables.useSupportLibrary = true } }

Además, asegúrese de estar utilizando una versión de biblioteca de soporte superior a la v23.4, cuando Google volvió a agregar el soporte para contenedores extraíbles para VectorDrawables ( plus.google.com/+AndroidDevelopers/posts/B7QhFkWZ6YX )

Actualizar

Y para los cambios de código:

  1. Asegúrese de actualizar a la app:srcCompat cada lugar que acepte el atributo android:src (el IDE le avisará si no es válido, como para la etiqueta <bitmap> ).
  2. Para los atributos TextView utilizados en TextView y vistas similares, tendrá que configurarlos programáticamente por ahora. Un ejemplo de configuración de drawableStart :

    Drawable drawable = AppCompatResources.getDrawable( getContext(), R.drawable.your_vector_drawable); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { textView.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null); }


La sugerencia de Guilherme P no estaba funcionando para mí. Seguí adelante y tomé la decisión de usar png donde necesito hacer cosas fuera de la aplicación: srcCompat, es decir, drawableLeft, drawableRight, etc. Este fue un cambio bastante fácil de hacer, y no tiene los posibles problemas de memoria AppCompatDelegate.setCompatVectorFromResourcesEnabled ( cierto); presenta.


Para cualquiera que actualice a Android Gradle 3.0 y superior, no es necesario usar AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) , o establecer vectorDrawables.useSupportLibrary = true (agregar esto causará problemas) y usar la app:srcCompat , simplemente funciona.

Tómeme dos días para resolver esto, y no he encontrado ningún documento relacionado en los documentos de Google ...


Para desarrollar las otras muy buenas respuestas , aquí hay un diagrama que puede ayudarlo. Es válido si tiene la Biblioteca de soporte desde 23.4.0 hasta al menos 25.1.0.


Probamos 3 cosas

vectorDrawables.useSupportLibrary = true

Establecer setCompatVectorFromResourcesEnabled en la clase de aplicación

static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }

Y use la app:srcCompat

Pero incluso después de eso, estaba fallando con

Resources$NotFoundException: File res/drawable/$my_icon__0.xml from color state list resource ID #0x7f080008

luego descubrimos que nuestro SVG tenía una etiqueta Gradient. La conversión de la etiqueta de degradado a rutas individuales para la API inferior <= 23 y el uso de la misma API SVG> = 24 funcionó.

Obtuve ayuda de esta respuesta https://.com/a/47783962/2171513


Simplemente superponga el vector dibujable a la lista de estados y luego se resolverá el problema

Por ejemplo, tiene una imagen vectorial de flecha hacia atrás:

ic_back_arrow.xml

sí, debe superponerlo a la lista de capas xml (ic_back_arrow_vector_vector.xml):

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_back_arrow"/> </layer-list>

Porque la lógica:

vectorDrawables.useSupportLibrary = true

y

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

no lo ayudará en algunos dispositivos de China y dispositivos Samsung más antiguos. Si no los superpone, fallará.


Una alternativa a la respuesta de Benny es crear una superclase de Activity :

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

Ahora extienda VectorDrawableActivity lugar de AppCompatActivity .


Uso más sencillo:

app:drawableRightCompat ="@drawable/ic_mobilelogin" app:drawableEndCompat="@drawable/ic_mobilelogin" app:srcCompat="@drawable/ic_mobile"

y ... solo use la aplicación: ** Compat para compatibilidad

También agregue soporte en buil.gradle (Módulo)

android { defaultConfig { vectorDrawables.useSupportLibrary = true } }


VectorDrawables en pre-lollipop debería funcionar bien sin usar

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

Si desea usar VectorDrawables dentro de ImageViews, puede usar el atributo srcCompat y funcionará, pero dentro de Buttons o TextViews no lo hará , por lo que debe envolver el Drawable en un InsetDrawable o LayerDrawable. Descubrí otro truco, si estás usando el enlace de datos, puedes hacer esto:

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

Eso funcionará mágicamente, no he investigado lo que sucede detrás de escena, pero supongo que TextView está utilizando el método getDrawable de AppCompatResources o similar.


Yo tuve el mismo problema. Pero haciendo mucha I + D obtuve la respuesta.

Para el uso de Imageview y ImageButton, la app:srcCompat="@drawable/...." y para otras vistas como Button, Textview, en lugar de usar "drawableLeft/right..." en el XML, especifique drawables programáticamente como:

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

Y use "AppCompatResources" para obtener el sorteo.


Yo tuve el mismo problema. Y arreglarlo quitando

vectorDrawables.useSupportLibrary = true

Mi versión de destino es 25 y la biblioteca de soporte es

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


ÚLTIMA ACTUALIZACIÓN - Jun / 2019

La biblioteca de soporte ha cambiado un poco desde la respuesta original. Ahora, incluso gradle puede generar automáticamente el PNG en el momento de la compilación. Entonces, a continuación hay dos nuevos enfoques que deberían funcionar en estos días. Puedes encontrar más información here:

Biblioteca de soporte

Probablemente, esta es la solución que funcionará para usted. Si viniste aquí, significa que tu Android Studio no está generando los PNG automáticamente para ti. Entonces, tu aplicación está fallando. PNG Generation solo admite un subconjunto de elementos XML. Sin embargo, esta solución es compatible con todas las etiquetas xml. Por lo tanto, tiene soporte completo para su vector dibujable.

Primero debes actualizar tu build gradle para soportarlo:

android { defaultConfig { vectorDrawables.useSupportLibrary = true } } dependencies { compile ''com.android.support:appcompat-v7:23.2.0'' // OR HIGHER }

Y luego, use app:srcCompat lugar de android:src para vectores dibujables. No olvides esto.

Para TextView , si está utilizando AndroidX, puede usar la app:drawableLeftCompat (o derecha, arriba, abajo) en lugar de la app:drawableLeft

Si no está utilizando AndroidX o un botón, puede intentar configurarlo dinámicamente mediante

Drawable icon = AppCompatResources.getDrawable(context, <drawable_id>); textView.setCompoundDrawablesWithIntrinsicBounds(<leftIcon>,<topIcon>,<rightIcon>,<bottomIcon>);

Generación PNG

Gradle puede crear automáticamente las imágenes PNG para usted en el momento de la compilación. Sin embargo, en este enfoque, no todos los elementos xml son compatibles . Esta solución es conveniente porque no necesita cambiar nada en su código o en su build.gradle. Solo asegúrate de estar usando Android Plugin 1.5.0 o superior y Android Studio 2.2 o superior .

Estoy usando esta solución en mi aplicación y funciona bien. No se necesita una marca adicional de build.gradle. No es necesario hackear. Si va a `/ build / generate / res / pngs / ...", puede ver todos los PNG generados.

Entonces, si tiene algún ícono simple (ya que no todos los elementos xml son compatibles), esta solución puede funcionar para usted. Simplemente actualice su Android Studio y su complemento Android Gradle.

ACTUALIZACIÓN - Jul / 2016

Rehabilitaron ese VectorDrawable en
Biblioteca de soporte de Android 23.4.0

Para los usuarios de AppCompat , hemos agregado una API opcional para volver a habilitar la compatibilidad con Vector Drawables de los recursos (el comportamiento que se encuentra en 23.2) a través de AppCompatDelegate.setCompatVectorFromResourcesEnabled (verdadero): tenga en cuenta que esto todavía puede causar problemas con el uso de la memoria y problemas para actualizar instancias de configuración, de ahí que esté deshabilitado de forma predeterminada.

Tal vez , la configuración de build.gradle ahora está obsoleta y solo necesita habilitarla en las actividades adecuadas (sin embargo, debe probarla).

Ahora, para habilitarlo, debes hacer:

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

Respuesta original - Abr / 2016

Creo que esto está sucediendo porque el Vector de soporte estaba deshabilitado en la última versión de la biblioteca: 23.3.0

De acuerdo con este POST :

Para los usuarios de AppCompat, hemos decidido eliminar la funcionalidad que le permite utilizar los dibujos vectoriales de los recursos en dispositivos pre-Lollipop debido a problemas encontrados en la implementación en la versión 23.2.0 / 23.2.1 (NÚMERO 205236) . Usando la aplicación: srcCompat y setImageResource () continúa funcionando.

Si visita el problema ISSUE 205236 , parece que se habilitarán en el futuro, pero el problema de memoria no se solucionará pronto:

En la próxima versión, agregué una API opcional donde puede volver a habilitar el soporte de VectorDrawable que se eliminó. Viene con las mismas advertencias que antes (uso de memoria y problemas con la actualización de la configuración).

Tuve un problema similar. Entonces, en mi caso, revertí todos los íconos que usan vectores dibujables desde recursos a imágenes PNG nuevamente (ya que el problema de memoria seguirá ocurriendo incluso después de que brinden una opción para habilitarlo nuevamente).

No estoy seguro de si esta es la mejor opción, pero soluciona todos los bloqueos en mi opinión.