2013-08-22 4 views
65

declum-styleable 속성이 enum 인 사용자 정의보기 (here)를 만들었습니다. xml에서는 이제 내 사용자 지정 특성에 대한 enum 항목 중 하나를 선택할 수 있습니다. 이제이 값을 프로그래밍 방식으로 설정하는 메서드를 만들고 싶지만 enum에 액세스 할 수 없습니다. mCustomView.setIcon(R.id.enum_name_x);가 하지만 열거를 찾을 수 없거나 심지어 아무 생각이 :코드에서 attrs.xml에서 생성 된 enum을 얻는 방법

attr.xml

<declare-styleable name="IconView"> 
    <attr name="icon" format="enum"> 
     <enum name="enum_name_one" value="0"/> 
     .... 
     <enum name="enum_name_n" value="666"/> 
    </attr> 
</declare-styleable>  

layout.xml는

<com.xyz.views.IconView 
    android:id="@+id/heart_icon" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:icon="enum_name_x"/> 

내가 필요한 것은 무엇인가 같다 열거 형이나 열거 형의 이름을 어떻게 얻을 수 있습니까?

감사

답변

63
속성 열거에서 자바 열거 얻을 수있는 자동화 된 방법이 될 것 같지 않습니다이

- 당신이 지정한 숫자 값을 얻을 수 있습니다 자바를 - 문자열이 당신으로 (XML 파일에서 사용하기위한 것입니다 보여 주다).

당신은 당신의보기 생성자에서이 작업을 수행 할 수 있습니다 :

TypedArray a = context.getTheme().obtainStyledAttributes(
       attrs, 
       R.styleable.IconView, 
       0, 0); 

    // Gets you the 'value' number - 0 or 666 in your example 
    if (a.hasValue(R.styleable.IconView_icon)) { 
     int value = a.getInt(R.styleable.IconView_icon, 0)); 
    } 

    a.recycle(); 
} 

당신이 당신 자신을 열거 형 자바로 값을 매핑하거나 필요 열거에 값, 예를 들어 원하는 경우 :

private enum Format { 
    enum_name_one(0), enum_name_n(666); 
    int id; 

    Format(int id) { 
     this.id = id; 
    } 

    static Format fromId(int id) { 
     for (Format f : values()) { 
      if (f.id == id) return f; 
     } 
     throw new IllegalArgumentException(); 
    } 
} 

그런 다음 첫 번째 코드 블록에서 당신은 사용할 수 있습니다

Format format = Format.fromId(a.getInt(R.styleable.IconView_icon, 0))); 

(이 페이지에서 예외를 throw하지만 oint는 좋은 아이디어가 아닐 수도 있습니다. 아마도 합리적인 기본값을 선택하는 것이 더 낫습니다.

7

글쎄요. 귀하의 Enum 선언에서와 같이 선언 된 스타일 가능 요소에서 서수가 동일한 지 확인하고 배열로 액세스하십시오.

TypedArray a = context.getTheme().obtainStyledAttributes(
        attrs, 
        R.styleable.IconView, 
        0, 0); 

int ordinal = a.getInt(R.styleable.IconView_icon, 0); 

if (ordinal >= 0 && ordinal < MyEnum.values().length) { 
     enumValue = MyEnum.values()[ordinal]; 
} 
+0

여기 열거 형 ordinal에 의존하는 것은 신뢰할 수없는 코드를 작성하기로되어 있다고 생각합니다. 한 가지는 업데이트되고 다른 하나는 문제가되지 않습니다. – tir38

2

질문이 게시 된 지 오래되었지만 최근에 같은 문제가있었습니다. Square의 JavaPoet과 build.gradle을 사용하여 프로젝트 빌드시 attrs.xml에서 자동으로 Java enum 클래스를 생성하는 약간의 해킹을 수행했습니다.

약간의 데모와 https://github.com/afterecho/create_enum_from_xml

에 대한 설명과 함께 추가 정보가 도움이되기를 바랍니다가있다.

관련 문제