Ho avuto lo stesso problema e ho fatto un ulteriore passo avanti per risolverlo. L'unico problema è che non è possibile specificare NavStateListDrawable in xml, quindi è necessario impostare lo sfondo dell'elemento dell'interfaccia utente tramite codice. Il metodo onStateChange deve quindi essere sostituito per garantire che ogni volta che viene modificato il livello del drawable principale, si aggiorni anche il livello dell'elenco di livelli figlio.
Durante la costruzione di NavStateListDrawable è necessario passare il livello dell'icona che si desidera visualizzare.
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;
}
}
Per tutti i diversi stati disegnabili del pulsante di navigazione ho qualcosa come il seguente.
<?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>
Stavo per postare questo come una domanda e una risposta, ma visto che hai posto la stessa domanda, ecco qui. Nota, questo ti fa risparmiare un sacco di definizioni di file xml. sono andato giù da circa 50-100 definizioni xml fino a circa 4 !.
non sarebbe più semplice avere due selettori e scambiarli? – bigstones
Il problema è che puoi finire con centinaia di file xml. – Emile