studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android imageview drawable

para - manual de programacion android pdf



Reemplace las imágenes del selector mediante programación (2)

Tengo un ImageView que tiene un recurso de imagen dibujable en un selector. ¿Cómo puedo acceder mediante programación al selector y cambiar las imágenes del estado resaltado y no resaltado?

Aquí hay un código de selector:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/iconSelector"> <!-- pressed --> <item android:state_pressed="true" android:drawable="@drawable/btn_icon_hl" /> <!-- focused --> <item android:state_focused="true" android:drawable="@drawable/btn_icon_hl" /> <!-- default --> <item android:drawable="@drawable/btn_icon" /> </selector>

Quiero poder reemplazar btn_icon_hl y btn_icon con otras imágenes.


Por lo que he podido encontrar (he intentado hacer algo similar), no hay forma de modificar un solo estado después de que ya se haya definido StateListDrawable. Sin embargo, puede definir un NUEVO código a través de:

StateListDrawable states = new StateListDrawable(); states.addState(new int[] {android.R.attr.state_pressed}, getResources().getDrawable(R.drawable.pressed)); states.addState(new int[] {android.R.attr.state_focused}, getResources().getDrawable(R.drawable.focused)); states.addState(new int[] { }, getResources().getDrawable(R.drawable.normal)); imageView.setImageDrawable(states);

Y solo podría tener dos de ellos a mano, o crear uno diferente cuando lo necesite.


Tuve el mismo problema e hice un paso más para resolverlo. Sin embargo, el único problema es que no puede especificar NavStateListDrawable en xml, por lo que debe establecer el fondo de su elemento de UI a través del código. El método onStateChange se debe sobreescribir para garantizar que cada vez que se cambie el nivel del dibujo principal principal, también actualice el nivel de la lista de nivel infantil.

Al construir el NavStateListDrawable, debe pasar el nivel del icono que desea visualizar.

public class NavStateListDrawable extends StateListDrawable { private int level; public NavStateListDrawable(Context context, int level) { this.level = level; //int stateChecked = android.R.attr.state_checked; int stateFocused = android.R.attr.state_focused; int statePressed = android.R.attr.state_pressed; int stateSelected = android.R.attr.state_selected; addState(new int[]{ stateSelected }, context.getResources().getDrawable(R.drawable.nav_btn_pressed)); addState(new int[]{ statePressed }, context.getResources().getDrawable(R.drawable.nav_btn_selected)); addState(new int[]{ stateFocused }, context.getResources().getDrawable(R.drawable.nav_btn_focused)); addState(new int[]{-stateFocused, -statePressed, -stateSelected}, context.getResources().getDrawable(R.drawable.nav_btn_default)); } @Override protected boolean onStateChange(int[] stateSet) { boolean nowstate = super.onStateChange(stateSet); try{ LayerDrawable defaultDrawable = (LayerDrawable)this.getCurrent(); LevelListDrawable bar2 = (LevelListDrawable)defaultDrawable.findDrawableByLayerId(R.id.nav_icons); bar2.setLevel(level); }catch(Exception exception) { } return nowstate; } }

Para todos los diferentes estados dibujables del botón de navegación, tengo algo como lo siguiente.

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/top_bar_default" > </item> <item android:id="@+id/nav_icons" android:bottom="0dip"> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:maxLevel="0" > <bitmap android:src="@drawable/top_bar_icon_back" android:gravity="center" /> </item> <item android:maxLevel="1" > <bitmap android:src="@drawable/top_bar_icon_nav" android:gravity="center" /> </item> <item android:maxLevel="2" > <bitmap android:src="@drawable/top_bar_icon_settings" android:gravity="center" /> </item> <item android:maxLevel="3" > <bitmap android:src="@drawable/top_bar_icon_search" android:gravity="center" /> </item> </level-list> </item> </layer-list>

Iba a publicar esto como una pregunta y respuesta, pero viendo que has hecho la misma pregunta, aquí tienes. Tenga en cuenta que esto le ahorra infinidad de definiciones de archivos xml. bajé de aproximadamente 50-100 definiciones de xml a aproximadamente 4 !.