Android-사용자 정의 속성이있는 사용자 정의 UI


113

사용자 정의 UI 요소를 만들 수 있다는 것을 알고 있습니다 (View 또는 특정 UI 요소 확장을 통해). 그러나 새로 생성 된 UI 요소에 새로운 속성이나 속성을 정의 할 수 있습니까? (상속되지는 않지만 기본 속성 또는 속성으로 처리 할 수없는 일부 특정 동작을 정의하는 새로운 것을 의미합니다)

예 : 내 맞춤 요소 요소 :

<com.tryout.myCustomElement
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   android:myCustomValue=<someValue>
/>

따라서 MyCustomValue 를 정의 할 수 있습니까? 있습니까?

고마워



여기에 안드로이드의 사용자 정의 속성에 대한 멋진 기사가 있습니다 -amcmobileware.org/android/blog/2016/09/11/custom-attributes
Arkadiusz Cieśliński

관련 질문에 대한 내 대답을 살펴보십시오 .
Helios 2017

답변:


258

예. 짧은 가이드 :

1. 속성 XML 만들기

/res/values/attrs.xml속성과 유형을 사용하여 내부에 새 XML 파일을 만듭니다.

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="MyCustomElement">
        <attr name="distanceExample" format="dimension"/>
    </declare-styleable>
</resources>

기본적으로 <declare-styleable />모든 사용자 정의 속성 (여기서는 하나만)을 포함하는보기에 대해 하나를 설정해야 합니다. 가능한 유형의 전체 목록을 찾지 못 했으므로 소스를 살펴보아야합니다. 내가 아는 유형은 참조 (다른 리소스에 대한), 색상, 부울, 차원, 부동 소수점, 정수 및 문자열입니다. 입니다. 꽤 자명하다

2. 레이아웃에서 속성 사용

한 가지를 제외하고는 위에서했던 것과 동일한 방식으로 작동합니다. 사용자 정의 속성에는 고유 한 XML 네임 스페이스가 필요합니다.

<com.example.yourpackage.MyCustomElement
   xmlns:customNS="http://schemas.android.com/apk/res/com.example.yourpackage"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   customNS:distanceExample="12dp"
   />

꽤 직설적 인.

3. 전달받은 값을 활용하라

사용자 정의보기의 생성자를 수정하여 값을 구문 분석하십시오.

public MyCustomElement(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomElement, 0, 0);
    try {
        distanceExample = ta.getDimension(R.styleable.MyCustomElement_distanceExample, 100.0f);
    } finally {
        ta.recycle();
    }
    // ...
}

distanceExample 이 예제에서 개인 멤버 변수입니다. TypedArray다른 유형의 값을 구문 분석하기 위해 많은 다른 것이 있습니다.

그리고 그게 다야. 에서 파싱 된 값을 사용하여 View수정하십시오. 예를 들어 onDraw()그에 따라 모양을 변경하려면 에서 사용하십시오 .


7
TypedArray에 대해 유의하십시오. 작업이 끝나면 반드시 recycle ()을 호출하십시오.
zskalnik

여기에 당신은 좋은 목록 찾을 수 있습니다 github.com/android/platform_frameworks_base/blob/master/core/...
YAHYA

IDE (예 : Eclipse)가 사용자 정의 속성의 키 / 값을 자동 완성합니까?
AlikElzin-kilaka

23
gradle 빌드의 http://schemas.android.com/apk/res-auto경우 사용자 정의 네임 스페이스를 선언 할 때 사용해야 합니다
Dori

2
3 단계에서는 간단하게 사용할 수 있습니다 String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");ATTR 생성자에 전달하고 'initialText는'사용자 정의 속성 이름이있는 속성 세트입니다
바르 토스 Kosarzycki - kosiara

21

res / values ​​폴더에서 attr.xml을 만듭니다. 여기에서 속성을 정의 할 수 있습니다.

<declare-styleable name="">
    <attr name="myCustomValue" format="integer/boolean/whatever" />
</declare-styleable>

그런 다음 레이아웃 파일에서 사용하려면 추가해야합니다.

xmlns:customname="http://schemas.android.com/apk/res/your.package.name"

그런 다음 값을 customname:myCustomValue=""


이것은 대답이 아닙니다. 질문은 자바에서 프로그래밍 방식으로 변경하는 방법입니다
Fazal

-11

예, 할 수 있습니다. 그냥 <resource>태그를 사용하십시오 .
이렇게 :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>

공식 웹 사이트에서 링크


대답 해줘서 고마워요. 하지만 리소스에서 기본 "android :"값을 사용하는 것을 볼 수 있습니다. 내 요점은 사용자 정의 UI 요소의 매개 변수로 android : phoneNameSelected = "true"를 사용할 수 있다는 것입니다.
Waypoint 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.