2011-09-14 6 views
8

Este es mi selector personalizado (StateListDrawable)StateListDrawable y de mapa de bits de baldosas

<selector 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:drawable="@drawable/common_cell_background" /> 
    <item 
     android:state_pressed="true" 
     android:drawable="@drawable/common_cell_background_highlight" /> 
    <item 
     android:state_focused="true" 
     android:drawable="@drawable/common_cell_background_highlight" /> 
    <item 
     android:state_selected="true" 
     android:drawable="@drawable/common_cell_background_highlight" /> 
</selector> 

Ambos, common_cell_background y common_cell_background_highlight son XML. Código de abajo:

common_cell_background.xml

<bitmap 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/common_cell_background_bitmap" 
    android:tileMode="repeat" 
    android:dither="true"> 
</bitmap> 

common_cell_background_highlight.xml

<bitmap 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/common_cell_background_bitmap_highlight" 
    android:tileMode="repeat" 
    android:dither="true"> 
</bitmap> 

mapas de bits también son exactamente lo mismo. Lo más destacado es un poco más ligero y no hay otras diferencias. Ambos mapas de bits son archivos PNG.

Ahora puse

convertView.setBackgroundResource(R.drawable.list_item_background); 

y aquí está el problema. Mi common_cell_background no repite, se estira. Pero, ¿qué es sorprendente cuando toco en la celda de mi lista los cambios de fondo en common_cell_background_highlight y adivino qué? Todo está bien, se repite como debería ser. No tengo idea de dónde está el problema, por qué mi fondo no se repite, mientras que resaltar lo hace. ¿Alguna idea?

+0

mismo problema aquí. Parece que es aleatorio: a veces el mapa de bits se repite correctamente, a veces se estira el mismo problema – iseeall

+0

aquí. me vuelve loco. por favor, publique una solución si encuentra una. ¡Gracias! – dineth

+0

ver esto: http://stackoverflow.com/a/7615120/1037294 –

Respuesta

3

Este es el error, que se fijó en el ICS, consulte esta respuesta: https://stackoverflow.com/a/7615120/1037294

Aquí es una solución: https://stackoverflow.com/a/9500334/1037294

Tenga en cuenta, que la solución sólo es aplicable para BitmapDrawable, para otros tipos de dibujables como StateListDrawable necesitarás hacer un trabajo extra. Esto es lo que uso:

public static void fixBackgrndTileMode(View view, TileMode tileModeX, TileMode tileModeY) { 
    if (view != null) { 
     Drawable bg = view.getBackground(); 

     if (bg instanceof BitmapDrawable) { 
      BitmapDrawable bmp = (BitmapDrawable) bg; 
      bmp.mutate(); // make sure that we aren't sharing state anymore 
      bmp.setTileModeXY(tileModeX, tileModeY); 
     } 
     else if (bg instanceof StateListDrawable) { 
      StateListDrawable stateDrwbl = (StateListDrawable) bg; 
      stateDrwbl.mutate(); // make sure that we aren't sharing state anymore 

      ConstantState constantState = stateDrwbl.getConstantState(); 
      if (constantState instanceof DrawableContainerState) { 
       DrawableContainerState drwblContainerState = (DrawableContainerState)constantState; 
       final Drawable[] drawables = drwblContainerState.getChildren(); 
       for (Drawable drwbl : drawables) { 
        if (drwbl instanceof BitmapDrawable) 
         ((BitmapDrawable)drwbl).setTileModeXY(tileModeX, tileModeY); 
       } 
      } 
     } 
    } 
} 
+0

Gracias. Finalmente lo arreglé. –

+0

¿Cómo se aplica a un Drawable definido en xml? –

Cuestiones relacionadas