질문 : 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
완전한 예제를 원한다면 안드로이드 라벨보기 샘플을보세요.
TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
CharSequences=a.getString(R.styleable.LabelView_text);
<declare-styleable name="LabelView">
<attr name="text"format="string"/>
<attr name="textColor"format="color"/>
<attr name="textSize"format="dimension"/>
</declare-styleable>
<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
- StackOverflow 스레드 : 사용자 지정 컨트롤에 대한 XML 특성 검색
- Android의 내부 테마와 함께 getStyledAttributes를 사용하는 방법
- 사용자 정의 속성 정의 + 지원되는 속성 형식 목록
출처 : https://stackoverflow.com/questions/2695646/declaring-a-custom-android-ui-element-using-xml
'프로그래밍 언어 > Android' 카테고리의 다른 글
Android 에뮬레이터의 속도를 높이는 방법 (0) | 2021.08.23 |
---|---|
Android Min SDK Version vs Target SDK Version (0) | 2021.08.23 |
Android XML 그리기 가능 파일에서 원 모양을 정의하는 방법 (0) | 2021.08.20 |
Android에서 가로 모드를 비활성화하는 방법 (0) | 2021.08.13 |
Android에서 여백을 dp로 설정하는 방법 (0) | 2021.08.13 |