Android에서 스타일리시한 속성 선언
이 사건에 대한 귀중한 자료가 있어요declare-styleable
구성 요소에 대한 사용자 정의 스타일을 선언할 수 있는 태그입니다.나는 이 유효한 값들의 목록을 발견했습니다.format
attr
태그. 좋은 점은 있지만, 그 값들 중 일부를 어떻게 사용하는지는 설명되지 않습니다.attr.xml(표준 속성의 Android 소스)을 찾아보니 다음과 같은 작업을 할 수 있습니다.
<!-- The most prominent text color. -->
<attr name="textColorPrimary" format="reference|color" />
format
속성을 값의 조합으로 설정할 수 있습니다.일 겁니다.format
attribute는 파서가 실제 스타일 값을 해석하는 데 도움이 됩니다.그런 다음 attr.xml에서 이 내용을 발견했습니다.
<!-- Default text typeface. -->
<attr name="typeface">
<enum name="normal" value="0" />
<enum name="sans" value="1" />
<enum name="serif" value="2" />
<enum name="monospace" value="3" />
</attr>
<!-- Default text typeface style. -->
<attr name="textStyle">
<flag name="normal" value="0" />
<flag name="bold" value="1" />
<flag name="italic" value="2" />
</attr>
이 두 가지 모두 표시된 스타일에 대해 허용된 값의 집합을 선언하는 것으로 보입니다.
그래서 두 가지 질문이 있습니다.
- 한 세트의 스타일 속성 중 하나를 선택할 수 있는 스타일 속성의 차이점은 무엇입니까?
enum
값들과 집합을 취할 수 있는 값들.flag
가치관? - 더 좋은 자료를 아는 사람이 있습니까?
declare-styleable
(안드로이드 소스 코드를 역공학하는 것 외에) 작동합니까?
여기에는 다음과 같은 질문이 있습니다. 몇 가지 정보를 사용하여 사용자 지정 특성을 정의하는 것입니다. 하지만 많지는 않습니다.
그리고 이 글.플래그와 숫자에 대한 좋은 정보가 있습니다.
사용자 지정 XML 특성 플래그
플래그는 매우 작은 값의 부분 집합(즉, 속성 태그 아래에 정의된 값)만 허용된다는 점에서 특수한 속성 유형입니다.플래그는 "이름" 속성과 "값" 속성으로 지정됩니다.이름은 해당 특성 유형 내에서 고유해야 하지만 값은 그렇지 않아도 됩니다.이것이 Android 플랫폼이 진화하는 동안 "fill_parent"와 "match_parent"가 모두 동일한 동작으로 매핑되는 이유입니다.그들의 가치관은 똑같았습니다.
이름 특성은 레이아웃 XML 내의 값 플레이스에 사용되는 이름에 매핑되며 네임스페이스 접두사가 필요하지 않습니다.따라서 위의 "tiling mode"의 경우 "center"를 속성 값으로 선택했습니다."스트레칭"이나 "반복"을 쉽게 선택할 수 있었지만 다른 것은 선택할 수 없었습니다.실제 값을 대입하는 것조차 허용되지 않았을 것입니다.
값 속성은 정수여야 합니다.16진수 또는 표준 숫자 표현 중에서 선택하는 것은 당신에게 달려 있습니다.Android 코드 안에는 둘 다 사용되는 곳이 몇 군데 있고 Android 컴파일러도 기꺼이 수락합니다.
사용자 지정 XML 특성 열거형
숫자는 하나의 조항이 있는 플래그와 거의 동일한 방식으로 사용되며 정수와 상호 교환하여 사용할 수 있습니다.후드 아래의 Enums와 Integre가 동일한 데이터 유형, 즉 Integer에 매핑됩니다.정수를 사용하여 속성 정의에 나타나는 경우, Enums는 항상 나쁜 "마법의 숫자"를 방지하는 역할을 합니다.따라서 차원, 정수 또는 이름이 지정된 문자열 "fill_parent"가 있는 "android:layout_width"를 가질 수 있습니다.
이를 문맥에 맞게 표현하기 위해 정수 또는 문자열 "scroll_to_top"을 받아들이는 "layout_scroll_height"라는 사용자 지정 속성을 생성한다고 가정합니다.이를 위해서는 "integer" 형식 속성을 추가하고 enum을 사용하여 이를 따릅니다.
<attr name="layout_scroll_height" format="integer"> <enum name="scroll_to_top" value="-1"/> </attr>
이런 방식으로 Enums를 사용할 때 한 가지 규정은 사용자 정의 보기를 사용하는 개발자가 의도적으로 "-1 ″" 값을 레이아웃 매개 변수에 넣을 수 있다는 것입니다.그러면 "scroll_to_top"이라는 특수한 경우 로직이 트리거됩니다.Enum 값이 잘못 선택된 경우 이러한 예기치 않은(또는 예상치 못한) 동작으로 인해 라이브러리가 "레거시 코드" 파일로 빠르게 강등될 수 있습니다.
실제로 속성에 추가할 수 있는 실제 가치는 속성에서 얻을 수 있는 것에 따라 제한됩니다.인을 합니다.AttributeSet
자세한 힌트는 여기 클래스 참조.
다음을 얻을 수 있습니다.
- 부엉이 (부엉이)
getAttributeBooleanValue
), - 부유물()
getAttributeFloatValue
), - )
getAttributeIntValue
), - )
getAttributeUnsignedIntValue
), - 문자열()
getAttributeValue
)
@알레아담의 대답은 매우 도움이 되지만, 나는 그것이 한가지 주요한 차이점을 생략했습니다.enum
그리고.flag
일부 View에 을 할당할 의 값만 할 수 있습니다 전자는 하나를 선택하기 위한 것이며, 일부 View에 해당 속성을 할당할 때는 하나의 값만 선택할 수 있습니다.그러나 후자의 값은 비트 와이즈 OR 연산자를 사용하여 결합할 수 있습니다.
예를 들어, 인res/values/attr.xml
<!-- declare myenum attribute -->
<attr name="myenum">
<enum name="zero" value="0" />
<enum name="one" value="1" />
<enum name="two" value="2" />
<enum name="three" value="3" />
</attr>
<!-- declare myflags attribute -->
<attr name="myflags">
<flag name="one" value="1" />
<flag name="two" value="2" />
<flag name="four" value="4" />
<flag name="eight" value="8" />
</attr>
<!-- declare our custom widget to be styleable by these attributes -->
<declare-styleable name="com.example.MyWidget">
<attr name="myenum" />
<attr name="myflags" />
</declare-styleable>
res/layout/mylayout.xml
이제 할 수 있습니다.
<com.example.MyWidget
myenum="two"
myflags="one|two"
... />
따라서 열거형은 가능한 값 중 하나를 선택하고 플래그는 결합할 수 있습니다.숫자 값은 이 차이를 반영해야 합니다. 일반적으로 시퀀스를 수행하려면0,1,2,3,...
배열 및 및:용)예 이동 플래그 이동1,2,4,8,...
비트와이즈 OR을 사용하여 독립적으로 추가하거나 제거할 수 있습니다.|
깃발을 합칠 겁니다
2의 거듭제곱이 아닌 값으로 "메타 플래그"를 명시적으로 정의할 수 있으므로 일반적인 조합에 대한 일종의 축약어를 도입할 수 있습니다.예를 들어, 만약 우리가 이것을 우리의 것에 포함시켰다면.myflags
선언.
<flag name="three" value="3" />
그럼 우리가 편지를 쓸 수도 있었겠군요myflags="three"
대신에myflags="one|two"
, 와 완전히 동일한 결과를 위해3 == 1|2
.
개인적으로 나는 항상 다음을 포함하는 것을 좋아합니다.
<flag name="none" value="0" /> <!-- or "normal, "regular", and so on -->
<flag name="all" value="15" /> <!-- 15 == 1|2|4|8 -->
모든 플래그를 한 번에 설정하거나 설정할 수 있습니다.
더 미묘하게는 하나의 깃발이 다른 깃발에 의해 암시되는 경우일 수 있습니다.예를 들어, 다음과 같이 가정해 보겠습니다.eight
설정 중인 플래그는 강제로four
설정할 플래그입니다(아직 설정되지 않은 경우).그 다음에 다시 정의를 내릴 수 있습니다.eight
전까지에,은,four
발,
<flag name="eight" value="12" /> <!-- 12 == 8|4 -->
마지막으로 라이브러리 프로젝트에서 속성을 선언하지만 lib에 따라 다른 프로젝트의 레이아웃에 적용하려면 XML 루트 요소에서 바인딩해야 하는 네임스페이스 접두사를 사용해야 합니다.예.,
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:auto="http://schemas.android.com/apk/res-auto"
... >
<com.example.MyWidget
auto:myenum="two"
auto:myflags="one|two"
... />
</RelativeLayout>
언급URL : https://stackoverflow.com/questions/6020379/declaring-styleable-attributes-in-android
'programing' 카테고리의 다른 글
데이터를 로컬에 저장하는 방법.NET (C#) (0) | 2023.10.17 |
---|---|
jQuery에서 아이디 추가? (0) | 2023.10.17 |
MariaDb slow_query_log 환경 변수(도커 포함) (0) | 2023.10.17 |
원래 행 순서를 유지하면서 두 데이터 프레임 병합 (0) | 2023.10.17 |
Angularjs 데이터 저장소 모범 사례 (0) | 2023.10.17 |