Tôi đã có cùng một vấn đề và tiến thêm một bước để giải quyết nó. Tuy nhiên, vấn đề duy nhất là bạn không thể chỉ định NavStateListDrawable trong xml, vì vậy bạn phải đặt nền của phần tử UI thông qua mã. Phương thức onStateChange sau đó phải được ghi đè để đảm bảo rằng mỗi khi mức độ của bản vẽ chính được thay đổi, bạn cũng cập nhật cấp độ của danh sách cấp độ con.
Khi xây dựng NavStateListDrawable, bạn phải vượt qua cấp độ của biểu tượng bạn muốn hiển thị.
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;
}
}
Đối với tất cả các trạng thái có thể vẽ nút điều hướng khác nhau, tôi có một cái gì đó như sau.
<?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>
Tôi sẽ đăng bài này dưới dạng câu hỏi và câu trả lời, nhưng khi bạn hỏi chính câu hỏi đó, bạn sẽ đến đây. Lưu ý, điều này giúp bạn tiết kiệm rất nhiều định nghĩa tệp xml. tôi đã giảm từ khoảng 50-100 xml định nghĩa xuống còn khoảng 4!.