ViewGroup을 확장하는 클래스를 만들었습니다. 이 MyCustomViewGroup 클래스의 기능 중 하나는 Button을 확장하는 중첩 클래스 MyButton의 컨테이너 역할을합니다.공통 리소스에서 사용자 정의 ViewGroup의 여러 구성 요소에 대한 StateListDrawables 만들기
정상적인 방법으로 사용자 지정 AttributeSet에서 MyCustomViewGroup에 대한 사용자 지정 속성을 설정했습니다. 이 속성 중 하나는 MyButton 중첩 클래스의 인스턴스 배경에 사용할 StateListDrawable을 정의합니다. 이 클래스 변수를 mMyButtonBackground에 저장합니다.
public class MyCustomViewGroup extends ViewGroup {
private Drawable mMyButtonBackground;
...
MyCustomViewGroup에 MyButton의 새 인스턴스를 만들 때마다 배경을 설정합니다.
MyButton myButton = new MyButton(context);
myButton.setBackground(mMyButtonBackground);
런타임시 StateListDrawable은 가장 최근에 추가 된 MyButton 인스턴스에서만 작동하는 것 같습니다.
예를 들어 MyCustomViewGroup에 MyButton의 인스턴스를 4 개 생성한다고 가정 해보십시오. MyButton 번호 4를 클릭하면 StateListDrawable에 정의 된대로 배경이 변경됩니다. MyButton 1에서 3을 클릭하면 배경이 변경되지 않지만 MyButton 4에서 변경됩니다.
논리적으로 이것은 변경 가능성 문제를 암시합니다. 모든 MyButton 인스턴스는 mMyButtonBackground에 저장된 동일한 StateListDrawable을 공유합니다. 이것을 고려해 볼 때, 나는 시도했다 :
MyButton myButton = new MyButton(context);
Drawable myButtonBackground = mMyButtonBackground.mutate();
myButton.setBackground(myButtonBackground);
그러나 이것은 문제를 해결하지 못했다. 나는 또한 그것을 StateListDrawable로 캐스팅하려고 시도했습니다.
MyButton myButton = new MyButton(context);
StateListDrawable myButtonBackground = (StateListDrawable)mMyButtonBackground.mutate();
myButton.setBackground(myButtonBackground);
이 또한 문제를 해결하지 못했습니다. 이 문제를 해결하기 위해 내 연구에서 나는 this article by Romain Guy on Drawable mutations을 읽었습니다. StateListDrawable은 Drawable의 하위 클래스이므로 동일한 접근 방식을 적용 할 수 있어야한다고 생각 했겠지만 작동시키지 못합니다. 내가 뭘 놓치고 있니?
아니요 정적이 아니지만 지금은 명확하게하기 위해 질문을 편집했습니다. 감사. –