ฉันมีปัญหาเดียวกันและไปอีกขั้นเพื่อแก้ปัญหา อย่างไรก็ตามปัญหาเดียวคือคุณไม่สามารถระบุ NavStateListDrawable ใน xml ได้ดังนั้นคุณต้องตั้งค่าพื้นหลังขององค์ประกอบ UI ของคุณผ่านโค้ด จากนั้นเมธอด onStateChange จะต้องถูกแทนที่เพื่อให้แน่ใจว่าทุกครั้งที่มีการเปลี่ยนแปลงระดับของ main drawable คุณจะต้องอัปเดตระดับของรายการระดับรองด้วย
เมื่อสร้าง NavStateListDrawable คุณจะต้องผ่านในระดับของไอคอนที่คุณต้องการแสดง
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;
}
}
สำหรับสถานะที่วาดได้ของปุ่มนำทางที่แตกต่างกันทั้งหมดฉันมีสิ่งต่อไปนี้
<?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>
ฉันกำลังจะโพสต์สิ่งนี้เป็นคำถามและคำตอบ แต่เมื่อคุณถามคำถามนั้นแล้วคุณไปได้เลย หมายเหตุสิ่งนี้ช่วยให้คุณประหยัดค่านิยามไฟล์ xml จำนวนมาก ฉันลดจากคำจำกัดความ 50-100 xml ลงเหลือประมาณ 4!