Quiero crear botones personalizados para usar en un TabHost. He intentado simplemente usar el mismo recurso de imagen (png), pero he cambiado el filtro de color dependiendo del estado. Así que hice este bit para servir como la disposición para el botón personalizado:StateListDrawable para cambiar los filtros de color
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ImageView android:id="@+id/tab_icon"
android:layout_centerInParent="true" android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView android:id="@+id/tab_text" android:layout_below="@id/tab_icon"
android:layout_centerHorizontal="true" android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
En mi actividad, añado las lengüetas de la siguiente manera:
tabHost.addTab(tabHost.newTabSpec(TAB_NAME_NEWS).setIndicator(buildTab(R.drawable.tab_icon_news, R.string.news))
.setContent(newsIntent));
y este es el método de 'buildTab':
private final static int[] SELECTED = new int[] { android.R.attr.state_selected };
private final static int[] IDLE = new int[] { -android.R.attr.state_selected };
private View buildTab(int icon, int label) {
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.tab_button, null);
StateListDrawable drawable = new StateListDrawable();
Drawable selected = getResources().getDrawable(icon);
selected.mutate();
selected.setBounds(0, 0, selected.getIntrinsicWidth(), selected.getIntrinsicHeight());
selected.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x0000FF00));
drawable.addState(SELECTED, selected);
Drawable idle = getResources().getDrawable(icon);
idle.mutate();
idle.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x000000FF));
drawable.addState(IDLE, idle);
((ImageView) view.findViewById(R.id.tab_icon)).setImageDrawable(drawable);
((TextView) view.findViewById(R.id.tab_text)).setText(getString(label));
return view;
}
en el estado seleccionado, la imagen debe ser completamente verde (0x0000FF00
), y en el estado no seleccionado, debería ser azul (0x000000FF
).
El problema es que los filtros de color parecen ser ignorados por completo. No puedo ver los colores cambian bajo ninguna circunstancia.
También he intentado conseguir el mismo resultado mediante el establecimiento de la propiedad android:tint
en el <ImageView/>
, pero al parecer no se puede utilizar una referencia a un <selector>
allí, ya que arroja una NumberFormatException
.
No veo lo que estoy haciendo mal así que cualquier ayuda sería apreciada.
supongo que deseo hacer una imageView que podría tener el nuevo "StateDrawable" en xml, ¿cómo podría hacerlo? –
Excelente respuesta, pero puedo sugerir una mejora. Existe el método 'StateSet.stateSetMatches', que comprueba si el estado dibuja coincide con el estado deseado o no (en lugar de iterar manualmente sobre el conjunto) –