Ich hatte das gleiche Problem und ging noch einen Schritt weiter, um es zu lösen. Das einzige Problem ist jedoch, dass Sie NavStateListDrawable nicht in XML angeben können, sodass Sie den Hintergrund Ihres UI-Elements über Code festlegen müssen. Die onStateChange-Methode muss dann überschrieben werden, um sicherzustellen, dass Sie bei jeder Änderung der Ebene des Hauptzeichens auch die Ebene der Liste der untergeordneten Ebenen aktualisieren.
Beim Erstellen des NavStateListDrawable müssen Sie die Ebene des Symbols übergeben, das Sie anzeigen möchten.
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;
}
}
Für all die verschiedenen Zeichnungszustände der Navigationsschaltfläche habe ich ungefähr Folgendes.
<?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>
Ich wollte dies als Frage und Antwort posten, aber da Sie genau diese Frage gestellt haben, können Sie loslegen. Beachten Sie, dass Sie dadurch eine Menge XML-Dateidefinitionen sparen. Ich ging von ungefähr 50-100 XML-Definitionen auf ungefähr 4!.