xml - tutorial - 안드로이드 스튜디오 레이아웃 에디터




XML을 사용하여 사용자 정의 Android UI 요소 선언하기 (4)

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


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

1. 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 과 같은 표준이 아닌 안드로이드 속성은 선언 된 타입을 가질 필요가 있습니다. 수퍼 클래스에서 선언 된 태그는 다시 선언 할 필요없이 하위 클래스에서 사용할 수 있습니다.

2. 생성자 생성

초기화에는 AttributeSet 를 사용하는 2 개의 생성자가 있으므로, 생성자가 호출하는 별도의 초기화 메소드를 작성하는 편이 편리합니다.

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 는 자동 생성 된 int[] 리소스입니다. 각 요소는 속성의 ID입니다. 속성 이름을 요소 이름에 추가하여 XML의 각 특성에 대한 속성을 생성합니다. 예를 들어 R.styleable.MyCustomView_android_text 에는 MyCustomView 대한 android_text 특성이 포함되어 있습니다. 그런 다음 다양한 get 함수를 사용하여 TypedArray 에서 속성을 검색 할 get 있습니다. 속성이 XML에 정의되지 않은 경우 null 이 리턴됩니다. 물론 반환 형식이 기본 형식 인 경우를 제외하고는 두 번째 인수가 반환됩니다.

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

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

이 스레드 마다 미래에 변경 될 수 있으므로 android.R.styleable 에는 아무 것도 사용 하지 않아야 합니다. 한 곳에서 모든 상수를 보는 것이 유용하기 때문에 여전히 문서에 있습니다.

3. 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 샘플

완전한 예제가 필요하다면 android label view 샘플을보십시오.

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"

모래밭


Google이 개발자 페이지를 업데이트하고 다양한 교육을 추가 한 것 같습니다.

그 중 하나는 사용자 정의보기 생성을 다루며 here 에서 찾을 수 here


레이아웃 파일을 다른 레이아웃 파일에 포함 할 수 있습니다.

             <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="30dp" >

                <include
                    android:id="@+id/frnd_img_file"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    layout="@layout/include_imagefile"/>

                <include
                    android:id="@+id/frnd_video_file"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    layout="@layout/include_video_lay" />

                <ImageView
                    android:id="@+id/downloadbtn"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_centerInParent="true"
                    android:src="@drawable/plus"/>
            </RelativeLayout>

여기서 include 태그의 레이아웃 파일은 같은 res 폴더에있는 다른 .xml 레이아웃 파일입니다.


좋은 참조. 감사! 그것에 추가 :

사용자 정의보기에 대한 사용자 정의 속성을 선언 한 라이브러리 프로젝트가 포함 된 경우 라이브러리가 아닌 프로젝트 네임 스페이스를 선언해야합니다. 예 :

라이브러리에 "com.example.library.customview"패키지가 있고 작업중인 프로젝트에 "com.example.customview"패키지가있는 경우 다음을 수행하십시오.

작동하지 않음 (오류 : "오류 : 패키지 'com.example.library.customview'의 속성 'newAttr'에 대한 리소스 식별자가 없습니다)"라는 메시지가 표시됩니다.

<com.library.CustomView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res/com.example.library.customview"
        android:id="@+id/myView"
        app:newAttr="value" />

윌 :

<com.library.CustomView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res/com.example.customview"
        android:id="@+id/myView"
        app:newAttr="value" />






user-interface