View - Widget



reference:

https://developer.android.com/reference/android/widget/package-summary 





 Android를 개발하면서 평소에 크게 의문갖지 않았던 부분들에 대해서 정리합니다. Widget에 대해 알아보겠습니다.


 Widget 개념

Widget이란 Android 앱에서 사용자와 상호작용하는 그래픽 요소입니다. 이 Widget은 View 클래스로 구현됩니다. View 클래스는 상호작용 요소로서 기본적인 block으로서 역할을 합니다. 네모난 영역을 차지하며, 그림을 그리고 이벤트 핸들링을 합니다.

android.widget 패키지는 보통 눈에 보이는 UI 요소를 포함하고 있습니다. 나만의 widget을 만들려면, View(혹은 그 하위클래스)를 상속받으면 됩니다. XML안에서 widget을 사용하려면 다음과 같은 파일들이 필요합니다 :

- Java implementation file : widget이 어떻게 동작할 것인지에 대한 java 파일입니다. XML layout으로부터 객체를 만들어낼 수 있다면, XML로부터 attribute 값들을 불러오는 생성자가 정의되어 있어야합니다.

- XML definition file : res/values/ 디렉토리 안의 XML 파일로, widget 및 그 widget의 attributes를 객체화하기 위해 사용되는 파일입니다. 다른 application에서 이 요소와 attributes를 또 다른 요소에서 사용하게 됩니다.

- Layout XML [optional] : res/layout/ 디렉토리 안의 optional한 XML 파일입니다. 이 파일은 widget의 layout을 표현합니다. Java 파일 안에서 이것을 정의할 수 있기 때문에 optional 합니다.

 

Widget 사용법

Widget을 만드는 예제입니다.

1. LableView.java (Java implementation file) : https://android.googlesource.com/platform/development/+/android-6.0.1_r46/samples/ApiDemos/src/com/example/android/apis/view/LabelView.java

코드가 긴 관계로 위 링크로 대체하였습니다. View의 생성자는 네가지가 오버로드 되어있습니다.


public View(Context context)

: 오로지 Java 코드안에서만 생성할때 쓰입니다. 이 생성자만 정의된 경우 XML 안에서 표현될 수 없습니다.

public View(Context context, @Nullable AttributeSet attrs)

: attrs 인자는 위에 설명된 XML definition file로 부터 attributes들을 객체화 시키는데 사용됩니다.

public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr)

: defStyleAttr 인자는 현재 테마안에서 View의 default 값을 제공하는 style resource에 대한 참조를 갖고있습니다. default 값을 갖지 않으려면 0을 넣어줍니다.

public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)

: defStyleRes 인자는 뷰에대한 default 값을 제공하는 style 리소스의 identifier입니다. defSytleAttr이 0 일때 혹은 현재 테마에서 찾을 수가 없을 때 사용됩니다. default 값을 갖지 않으려면 0을 넣어줍니다.


보통 생성자에서는 attrs(AttributeSet)을 객체화하여 View를 그릴 때 참고할 수 있게 합니다. 

Context의 obtainStyeldAttributes 메소드를 이용해 XML 파일에 정의된 attribute들을 객체화하여 TypedArray에 담습니다. 이 TypedArray로 부터 각각의 attribute들을 가져온 후 View를 그릴 때 활용 하는 것입니다.

Attribute들을 객체화하는데 성공했다면, 이제 실제로 View를 그려야합니다. View는 그려지는 단계는 세가지 단계입니다: 

Measurement - onMeasure 메소드 : View의 가로와 세로의 크기를 결정합니다. MeasureSpec을 이용해서 bitwise로 연산된 int 값을 이용합니다.

Layout - onLayout 메소드 : 결정된 크기를 기준으로 어느 위치에 그릴 것인지 결정합니다.

Draw - onDraw 메소드 : Canvas 객체를 이용하여 실제로 무엇을 그릴 것인지 결정합니다. 

위 메소드 들을 단계적으로 실행함으로서 비로소 View가 그려집니다.


2. attrs.xml (XML definition file) 

https://android.googlesource.com/platform/development/+/android-6.0.1_r46/samples/ApiDemos/res/values/attrs.xml

위 설명한 바와 같이 Widget이 어떤 attribute들을 사용할 것인지 정의 합니다.  <declare-styleable> 태그를 사용하며,  name 속성 값에 Java 파일의 클래스 이름을 넣어줍니다. 하위 아이템들로 <attr> 태그를 사용하며 name을 정하고 default 값이나 format을 정의해놓을 수도 있습니다. "[클래스 이름]_[속성 이름]"의 스트링으로 TypedArray에서 값을 가져올 수 있습니다.


3. custom_view_1.xml (XML definition file) 

:https://android.googlesource.com/platform/development/+/android-6.0.1_r46/samples/ApiDemos/res/layout/custom_view_1.xml

1, 2번을 통해 만들어진 Widget을 다른 layout 파일에서 사용한 예시입니다. 


Widget을 왜 사용하나?

Android application 안에서 어떤 UI가 표시되기 위한 각각 요소 단위로서 이해할 수 있습니다. Android를 처음 접할 때 무심코 사용했던 TextView, Button 등의 Widget들이 도대체 어떤 식으로 객체화되어 Java 코드 안에서 동작하는지 이해하여야 나만의 Widget을 정의하고 그릴 수 있을 것입니다. 


'programming > android' 카테고리의 다른 글

ViewGroup  (0) 2018.08.24
View - AppWidget  (0) 2018.08.23
Companion Objects in Kotlin  (0) 2018.04.08
어떤 Context를 써야 하나요?  (0) 2018.03.26
기본적인 메모리 관리  (0) 2018.03.06

+ Recent posts