Miałem ten sam problem i poszedłem o krok dalej, aby go rozwiązać. Jedyny problem polega jednak na tym, że nie można określić NavStateListDrawable w xml, więc trzeba ustawić tło elementu interfejsu użytkownika za pomocą kodu. Następnie należy zmienić metodę onStateChange, aby zapewnić, że za każdym razem, gdy zmieni się poziom głównej szuflady, aktualizuje się również poziom listy poziomów podrzędnych.
Podczas tworzenia NavStateListDrawable musisz przejść poziom ikony, którą chcesz wyświetlić.
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;
}
}
Dla wszystkich różnych stanów do rysowania przycisków nawigacyjnych mam coś takiego jak poniżej.
<?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>
Zamierzałem opublikować to jako pytanie i odpowiedź, ale widząc, jak zadałeś właśnie to pytanie, proszę bardzo. Uwaga, to oszczędza ci wielu definicji plików XML. spadłem z około 50-100 definicji xml do około 4 !.
Czy nie byłoby łatwiej mieć dwa selektory i zamienić je? – bigstones
Problem polega na tym, że możesz skończyć setkami plików xml. – Emile