프로그래밍 언어/Android

XML을 사용하여 사용자 정의 Android UI 요소 선언

Rateye 2021. 8. 20. 10:34
728x90
반응형
질문 : XML을 사용하여 사용자 정의 Android UI 요소 선언

XML을 사용하여 Android UI 요소를 선언하려면 어떻게해야합니까?

답변

Android 개발자 가이드에는 맞춤 구성 요소 빌드 라는 섹션이 있습니다. 안타깝게도 XML 속성에 대한 설명은 레이아웃 파일 내부의 컨트롤 선언 만 다루고 클래스 초기화 내부의 값을 실제로 처리하지는 않습니다. 단계는 다음과 같습니다.

1. Declare attributes in "values\attrs.xml"

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyCustomView">
        <attr name="android:text"/>
        <attr name="android:textColor"/>            
        <attr name="extraInformation" format="string" />
    </declare-styleable>
</resources>

declare-styleable 지정 가능 태그에 규정되지 않은 이름이 사용되었습니다. extraInformation 과 같은 비표준 Android 속성은 유형을 선언해야합니다. 수퍼 클래스에서 선언 된 태그는 재 선언 할 필요없이 서브 클래스에서 사용할 수 있습니다.

2. Create constructors

AttributeSet 을 사용하는 생성자가 두 개 있기 때문에 생성자가 호출 할 별도의 초기화 메서드를 만드는 것이 편리합니다.

private void init(AttributeSet attrs) { 
    TypedArray a=getContext().obtainStyledAttributes(
         attrs,
         R.styleable.MyCustomView);

    //Use a
    Log.i("test",a.getString(
         R.styleable.MyCustomView_android_text));
    Log.i("test",""+a.getColor(
         R.styleable.MyCustomView_android_textColor, Color.BLACK));
    Log.i("test",a.getString(
         R.styleable.MyCustomView_extraInformation));

    //Don't forget this
    a.recycle();
}

R.styleable.MyCustomView 는 각 요소가 속성의 ID 인 자동 생성 된 int[] 속성 이름을 요소 이름에 추가하여 XML의 각 속성에 대해 속성을 생성합니다. 예를 들어 R.styleable.MyCustomView_android_text MyCustomView android_text 속성이 포함되어 있습니다. 그런 다음 다양한 get 함수를 TypedArray 에서 속성을 검색 할 수 있습니다. XML에 정의 된 속성이 정의되지 않은 경우 null 이 리턴됩니다. 물론 반환 유형이 프리미티브 인 경우는 예외입니다.이 경우 두 번째 인수가 반환됩니다.

모든 속성을 검색하지 않으려면이 배열을 수동으로 생성 할 수 있습니다. 표준 Android 속성의 ID는 android.R.attr 포함되고이 프로젝트의 속성은 R.attr 됩니다.

int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};

이 스레드 에 따라 향후 변경 될 수 있으므로 android.R.styleable 에서 아무것도 사용해서는 안됩니다. 이 모든 상수를 한곳에서 보는 것이 유용하기 때문에 여전히 문서에 있습니다.

3. Use it in a layout files such as "layout\main.xml"

최상위 xml 요소에 네임 스페이스 선언 xmlns:app="http://schemas.android.com/apk/res-auto" 네임 스페이스는 서로 다른 스키마가 동일한 요소 이름을 사용할 때 가끔 발생하는 충돌을 방지하는 방법을 제공합니다 (자세한 내용은 이 문서 참조). URL은 스키마를 고유하게 식별하는 방법 일뿐입니다. 실제로 해당 URL에서 호스팅 할 필요가 없습니다 . 이것이 아무 작업도 수행하지 않는 것 같으면 충돌을 해결해야하는 경우가 아니면 실제로 네임 스페이스 접두사를 추가 할 필요가 없기 때문입니다.

<com.mycompany.projectname.MyCustomView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:text="Test text"
    android:textColor="#FFFFFF"
    app:extraInformation="My extra information"
/>

완전한 이름을 사용하여 사용자 정의보기를 참조하십시오.

Android LabelView Sample

완전한 예제를 원한다면 안드로이드 라벨보기 샘플을보세요.

LabelView.java

 TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
 CharSequences=a.getString(R.styleable.LabelView_text);

attrs.xml

<declare-styleable name="LabelView">
    <attr name="text"format="string"/>
    <attr name="textColor"format="color"/>
    <attr name="textSize"format="dimension"/>
</declare-styleable>

custom_view_1.xml

<com.example.android.apis.view.LabelView
    android:background="@drawable/blue"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    app:text="Blue" app:textSize="20dp"/>

이것은 네임 스페이스 속성이 LinearLayout 포함됩니다 xmlns:app="http://schemas.android.com/apk/res-auto"

Links

출처 : https://stackoverflow.com/questions/2695646/declaring-a-custom-android-ui-element-using-xml
728x90
반응형