Programing

프로그래밍 방식으로 선택기 이미지 교체

lottogame 2020. 7. 21. 21:15
반응형

프로그래밍 방식으로 선택기 이미지 교체


드로어 블 이미지 리소스가 선택기로 설정된 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!로 떨어졌습니다.

참고URL : https://stackoverflow.com/questions/4697528/replace-selector-images-programmatically

반응형