Modificación de la capa LayerDrawable en Android 2.3 .X (Gingerbread) e inferior

Tengo el siguiente LayerDrawable :

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/image_source" android:bottom="6dp" android:drawable="@drawable/default" android:left="14dp" android:right="14dp" android:top="6dp"> </item> <item android:drawable="@drawable/metaphor_photo_portrait"/> </layer-list> 

Necesito poder sustituir dinámicamente la imagen en @+id/image_source del código. He succeeed a hacer en Honeycomb + dispositivos con:

 mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable); mLayerDrawable.invalidateSelf(); 

Sin embargo, esto no funciona en dispositivos Gingerbread como setDrawableByLayerId es inestable para dispositivos Gingerbread ( enlace 1 , enlace 2 ). Se me aconseja construir el LayerDrawable desde cero. Empecé a hacer eso y actualmente me encuentro con el problema de establecer el intristicInset de la primera capa.

Intenté usar

 mLayerDrawable.setLayerInset(0, dp14, dp6, dp14, dp6); 

Donde dpxx son constantes me calculo. Sin embargo, parece que este método no está funcionando en Gingerbread tampoco ( enlace 1 ).

Así que decidí tratar de hacerlo de la otra manera – establecer los límites de la restangle del dibujable que establecer en la primera capa:

 drawable.setBounds(dp14, dp6, dp90 - dp14, dp90 - dp6); 

Perfecto, sin embargo, parece que los límites de configuración en la capa LayerDrawable se ignoran ( enlace 1 )

Ahora se aconseja utilizar la combinación de dos viwes de imagen. Sin embargo mi LayerDrawable es parte de LevelListDrawable y creo que no puedo incluir el diseño en tal.

En definitiva, esto no me permite modificar el contenido de mi LayerDrawable de ninguna manera en dispositivos pre-Honeycomb. Cualquier consejo sobre cómo debo proceder son apreciados!

 drawable.setBounds(mLayerDrawable.findDrawableByLayerId(R.id.image_source).getBounds()); mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable); mLayerDrawable.invalidateSelf(); 

Referencia: https://github.com/ytRino/LayerDrawableSample/blob/master/src/net/nessness/android/sample/layerdrawable/LayerDrawableSampleActivity.java

Finalmente lo conseguimos a wok de una manera muy extraña:

 LayerDrawable layerDrawable = (LayerDrawable) getResources().getDrawable(layerDrawableResourceId); layerDrawable.setDrawableByLayerId(R.id.image_source, drawable); Drawable[] layers = { layerDrawable }; LayerDrawable layerDrawableNew = new LayerDrawable(layers); 

Un colega mío encontró que si creamos nuevo LayerDrawable , establecemos el método que no funciona y luego envolveremos este LayerDrawable en otro, la visualización es correcta (tanto la imagen se cambia como se conservan los acolchados). Bastante un retoque y un montón de "No toque esto es magia", pero esta es la mejor solución que podríamos resolver.

  • ¿Por qué de repente la aplicación es incompatible con algunos dispositivos?
  • ¿Es posible destellar una ROM de dispositivo a un emulador o genymotion de AVD?
  • Optimización del archivo de manifiesto de Android para el mayor número de dispositivos compatibles
  • Android Support Library ActionBar no funciona en el dispositivo 2.3
  • Desventajas de usar la Biblioteca de Compatibilidad de Android en Honeycomb
  • Problema de compatibilidad de vídeo: el video grabado en Android no se reproduce en el iPhone
  • ¿Las aplicaciones de Android son compatibles con versiones anteriores?
  • Cómo utilizar NotificationCompat.Builder y startForeground?
  • Problemas de compatibilidad de Android 4.0 con Canvas.clipPath
  • Cómo utilizar appcompat-v7 con Android API 19
  • Yii Framework y Aplicación para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.