드로어 블 이미지 리소스가 선택기로 설정된 ImageView가 있습니다. 선택기에 프로그래밍 방식으로 액세스하고 강조 표시된 상태와 강조 표시되지 않은 상태의 이미지를 변경하려면 어떻게해야합니까?
다음은 선택기 코드입니다.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/iconSelector">
<!-- pressed -->
<item android:state_pressed="true" android:drawable="@drawable/btn_icon_hl" />
<!-- focused -->
<item android:state_focused="true" android:drawable="@drawable/btn_icon_hl" />
<!-- default -->
<item android:drawable="@drawable/btn_icon" />
</selector>
다른 이미지 로 교체 btn_icon_hl
하고 싶습니다 btn_icon
.
답변
내가 찾을 수있는 한 (나도 비슷한 것을 시도해 보았습니다) StateListDrawable이 이미 정의 된 후에는 단일 상태를 수정할 방법이 없습니다. 그러나 코드를 통해 새로운 것을 정의 할 수 있습니다.
StateListDrawable states = new StateListDrawable();
states.addState(new int[] {android.R.attr.state_pressed},
getResources().getDrawable(R.drawable.pressed));
states.addState(new int[] {android.R.attr.state_focused},
getResources().getDrawable(R.drawable.focused));
states.addState(new int[] { },
getResources().getDrawable(R.drawable.normal));
imageView.setImageDrawable(states);
그리고 그 중 두 개를 손에 들고 있거나 필요에 따라 다른 것을 만들 수 있습니다.
답변
나는 같은 문제가 있었고 그것을 해결하기 위해 한 걸음 더 나아갔습니다. 그러나 유일한 문제는 xml에서 NavStateListDrawable을 지정할 수 없으므로 코드를 통해 UI 요소의 배경을 설정해야한다는 것입니다. 그런 다음 기본 드로어 블의 수준이 변경 될 때마다 하위 수준 목록의 수준도 업데이트되도록 onStateChange 메서드를 재정의해야합니다.
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!로 내려 갔다.