세라쌤의 IT 튜토리얼

Widgets 본문

Android

Widgets

issell 2019. 3. 17. 19:42

< Widget 이란? >

- 안드로이드에서 말하는 widget은 크게 두 가지 의미로 사용된다.

  1. widget : ready-to-use 형태인 UI 인터페이스 (Button, Checkbox, TextView 등) 
  2. app widget : 홈화면 등의 다른 어플리케이션에 주입할 수 있는 미니어쳐 버전의 어플리케이션 (날씨 위젯, 스케쥴러 위젯 등)
지금 살펴볼 것은 1번이다.

< View와 Widget의 차이 >

 머릿속에 View와 Widget을 떠올릴 때 다음을 생각하자.

  •  View : 각 화면과 대상(위젯, 레이아웃)을 구분하는 투명한 직사각형
  •  Widget : 직사각형 안에 들어있는 내용물
물론 100% 맞는 말은 아니다.
좀 더 구체화 하자면 widget은 View를 상속 받은 자식 클래스들로 구성되어있다. 따라서 Widget은 View에 포함된다. 
 View는 추상/구현 클래스 그리고 Layout 클래스를 모두 포괄하며, 참고로 사용자 정의 위젯을 만드려면 View를 상속 받아서 구현한다. 

< widget의 종류 >

android document를 보면 widget 패키지의 자식 클래스들이 있다.
대부분의 widget 패키지의 클래스는 xml에도 같은 이름으로 존재한다.
대표적인 몇 가지만 살펴보자.


 TextView

 단순한 텍스트

 ImageView 

 이미지 (res/drawables 폴더의 이미지나 xml을 사용)

 EditText 

 텍스트 입력란

 Button 

 버튼

 RadioButton 

 라디오 버튼 (RadioGroup과 함께 사용, 단일 선택용) 

 Checkbox 

 체크 박스 (복수 선택용)

 ProgressBar 

 진행바 (원형, 바형)

 Spinner 

 항목 선택 ( html의 select태그 )

 RatingBar 

 평점

 DatePicker 달력





<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#c5e5e1"
android:orientation="vertical">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#e8c9c7"
android:text="ABCDEFGHIJKLMNOP"
android:layout_gravity="clip_horizontal"
android:textSize="30sp"/>

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_foreground"/>

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="버튼"/>


<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="확인"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="확인"/>


<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content" />


<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"
android:progress="25"
android:paddingHorizontal="20dp"/>
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/menu"> // 밑의 xml 파일 참고
</Spinner>


<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="7"
android:rating="4"/>
<DatePicker
android:layout_width="match_parent"
android:layout_height="match_parent"/>

    </LinearLayout>





참고 : Spinner의 경우는 res/values/strings.xml에 다음 항목을 추가한다. 다른 이유는 없고 Spinner는 사용자가 클릭하면 아이템 항목이 리스트 형태로 펼쳐지며 보여진다. 이때 보여줄 아이템을 Array 형태로 보여줘야 하기 때문에 2개의 아이템이 될 텍스트(여기서는 java, android)를 지정해보았다. 


<resources>
... (중략) ...


// 이부분만 추가한다.
<array name="menu">
<item>java</item>
<item>android</item>
</array>

    </resources> 




< widget의 선언 >

widget은 정적선언(xml) 동적선언(inflate) 두 가지 방법으로 선언할 수 있다.

보통은 xml을 사용한 정적선언을 주로 사용한다. 이 경우 해당 위젯에 이벤트 리스너를 적용해야 한다면 액티비티 클래스 내부에 xml에 선언한 id 값을 사용하여 객체화 후 리스너를 등록한다.

 특별한 상황에서 동적선언을 할 수 있는데 이를 inflating이라고 한다. LayoutManager와 같은 레이아웃 관리자를 생성하여 즉석에서 widget 클래스를 객체화하여 사용한다. 이 부분은 추후에 보자.





'Android' 카테고리의 다른 글

TextView  (0) 2019.03.25
Activity와 Activity 생명주기  (0) 2019.03.20
Frame Layout  (0) 2019.03.17
Relative Layout  (0) 2019.03.15
LinearLayout  (0) 2019.03.14
Comments