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:
- Compatibilidad del edificio PreferenceFragment en Android
- Android-support-v4.jar no se importa correctamente en Eclipse
- ¿PreferenceFragment fue intencionalmente excluido del paquete de compatibilidad?
- Crear aplicaciones multi-SDK para Android en Eclipse sin perder controles de tiempo de compilación
- ¿Qué es LinearLayoutCompat en appCompat v7?
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!
- ObjectAnimator en el nivel API <11
- La aplicación no es compatible con Samsung Galaxy Tab 10.1
- ¿Cómo puedo usar el mismo conjunto de pantallas de preferencias para todas las versiones de Android de 2.X a 4.X?
- ¿Es arm64-v8a compatible con armeabi-v7a?
- ¿Por qué usar Fragmentos "regulares" cuando tienes el Paquete de Compatibilidad de Android?
- Fragmentos onResume de la pila trasera
- ¿Pueden las aplicaciones Android 4.0 funcionar con dispositivos Android 2.0 y Android 3.0?
- ¿Por qué Blackberry y Android SDK necesitan versiones antiguas de Eclipse IDE?
drawable.setBounds(mLayerDrawable.findDrawableByLayerId(R.id.image_source).getBounds()); mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable); mLayerDrawable.invalidateSelf();
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.
- AndroidPocketSphinx: ¿Cómo sabe el sistema qué reconocedor se invoca?
- Cómo asegurarse de que los datos se guardarán antes de que android mata un proceso