2010년 11월 21일 일요일

코드요소 - User Interface의 기본 개념

안드로이드 애플리케이션에서 사용자 인터페이스는 View와 ViewGroup 객체를 사용해서 만든다. 많은 뷰와 뷰 그룹이 있지만 이들은 모두 View 클래스의 서브클래스이다.
View객체는 사용자 인터페이스에 나타나는 기본 단위이다. View 클래스는 텍스트필드, 버튼 등 "widget"이라고 불리는 클래스들의 베이스 클래스이다. ViewGroup 클래스는 linear, tabular, relative 등 레이아웃 클래스들의 베이스 클래스이다.
View 객체는 레이아웃 파라메터나 화면의 사각영역 등의 속성을 저장하는 데이터 구조이다. 그리고 측정치, 레이아웃, 그리기, 포커스 변경, 스크롤, 제스쳐 등을 관리하고 처리한다. 또한 뷰는 사용자와의 상호작용 이벤트의 수신 지점이다.

뷰 계층도

안드로이드 플랫폼에서 개발자는 다음 다이어그램에서 보이는 것과 같은 ViewGroup과 View 노드의 계층도를 사용하여 액티비티의 UI를 정의한다. 이 뷰 계층도 내에 자원요소에서 설명한 레이아웃, 위젯들이 배치되게 된다.

이 계층도는 간단할 수도 있고 필요한 만큼 복잡하게 정의할 수도 있으며, 안드로이드의 미리 정의된 위젯들을 사용하여 만들 수도 있고, 자신이 제작한 뷰들을 이용하여 만들 수도 있다.
이 뷰 계층도를 화면에 나타나도록 하려면, 액티비티가 setContentView() 메쏘드를 이용하여 루트 노드 객체에 대한 레퍼런스를 전달해야 한다. 안드로이드 시스템은 이 레퍼런스를 받아서 뷰 트리를 갱신,측정,생성한다. 계층도상의 루트 노드가 차일드 노드 자신을 그리도록 요청한다.--바꾸어 말하면, 각 뷰그룹 노드는 각 차일드 노드들에게 자신을 그리도록 요청하는 책임을 맡고 있다. 차일드는 부모 내에서 크기나 위치를 요청할 수 있지만, 각 차일드가 어디에 얼마나 크게 그려질지는 부모 노드가 최종적으로 결정한다. 안드로이드는 레이아웃의 엘리먼트들을 순차적으로 파싱(계층 트리의 꼭대기에서부터)하여 뷰를 인스턴스화하고 부모 뷰에 추가한다. 이 그리기가 순차적으로 이루어지기 때문에, 위치가 겹치는 엘리먼트가 있을 경우, 마지막에 그려진 뷰가 이전에 그려진 뷰의 위에 그려지게 된다.

UI 이벤트

UI에 뷰/위젯을 배치했으면, 사용자와의 상호작용에 의해 액션을 취할 필요가 있다. UI 이벤트를 인식하려면 다음 둘 중 한 가지를 해야 한다:
• 이벤트 리스터를 정의하고 그것을 뷰에 등록한다. 대부분, 이 방식으로 이벤트를 취한다. View 클래스에는 On<something>Listener라는 이름의 네스티드 인터페이스 콜렉션이 있고, 각 인터페이스에는 On<somethind>()라는 콜백 메쏘드가 들어 있다. 예를 들면, View.OnClickListerer(View의 클릭을 처리), View.OnTouchListener, View.OnKeyListener 등이 있다. 따라서 뷰가 클릭되었을 때 알려주기를 원한다면, OnClickListener를 구현하고 그 리스너의 onClick() 콜백 메쏘드(여기서 클릭에 대한 반응 코드를 입력)를 정의하고, 그것을 View에 setOnClickListener()로 등록해야 한다.
• 그 View의 기존 콜백 메쏘드를 오버라이드한다. 자신만의 View 클래스를 구현하고 그 안에서 발생하는 특정 이벤트를 취하려면 이 방식으로 구현한다. 처리할 수 있는 이벤트의 예로는 onTouchEvent(),onTrackballEvent(),onKeyDown() 등이 있다.

메뉴

메뉴는 어플리케이션의 UI에서 중요한 요소 중 하나이다. 메뉴를 통해 어플리케이션의 기능과 설정을 표시하는 안정적인 인터페이스를 만들 수 있다. 가장 일반적은 어플리케이션 메뉴는 기기에 있는 MENU 키를 누름으로써 나타나는 메뉴이다. 하지만, 사용자가 항목을 꾹 눌렀을 때 나타나는 컨텍스트 메뉴를 설정할 수도 있다.
메뉴 또한 뷰 계층도를 사용하여 구조화되어 있지만, 이 구조를 개발자가 정의하지는 않는다. 대신에, 개발자는 액티비티의 onCreateOptionsMenu() 나 onCreateContextMenu() 콜백 메쏘드를 통해 정의하고 메뉴에 포함시킬 항목들을 선언한다. 그러면 안드로이드 시스템이 필요한 때에 필요한 뷰 계층도를 자동으로 그리고 각 메뉴 항목을 표시한다.
메뉴는 자신의 이벤트를 처리하기 때문에 메뉴의 항목에 대해 이벤트 리스터를 등록할 필요가 없다. 메뉴의 항목이 선택되면, 프레임웍이 자동으로 onOptionsItemSelected() 나 onContextItemSelected() 메쏘드를 호출한다.
그리고 어플리케이션 레이아웃과 똑같이, 메뉴 항목을 XML 파일에 선언할 수도 있다.

어댑터

하드코딩된 정보를 표시하는 것이 아니라, 외부 데이터 소스에서 동적인 정보를 뷰 그룹에 표시하고 싶을 때가 있다. 이런 작업을 하려면 뷰 그룹으로 AdapterView를 사용하고 각 차일드 View는 그 Adapter로부터 데이터를 초기화하고 나타내도록 한다.
AdapterView 객체는 특정 Adapter 객체에 기반하여 그 차일드 뷰를 결정하는 ViewGroup을 구현한 것이다. Adapter는 데이터소스와 AdapterView(데이터를 화면에 표시) 사이의 통로 역할을 한다. Adapter 클래스를 구현한 것은 유형별로 여러 가지가 있는데, 예를 들면 Cursor로부터 데이터베이스 데이터를 읽어오는 CursorAdapter, 임의의 배열로부터 데이터를 읽어오는 ArrayAdapter 등이 있다.

스타일 및 테마

표준 위젯의 모양이 만족스럽지 않을 경우가 있다. 이것을 개선하기 위해, 자신의 스타일과 테마를 만들어 적용할 수 있다.
• 스타일은 레이아웃 상의 개별적인 엘리먼트에 개별적으로 적용시킬 수 있는 하나 이상의 구성 가능한 속성들이다. 예를 들어, 문자 크기와 색상을 지정하는 스타일을 정의하고, 그것을 특정 뷰 엘리먼트에 적용할 수 있다.
• 테마는 어플리케이션의 모든 액티비티나 특정 액티비티에 적용시킬 수 있는 하나 이상의 구성 가능한 속성들이다. 예를 들어, 윈도우 프레임과 패널 배경에 대한 색상 및 문자 크기와 색상을 지정한 테마를 정의할 수 있다. 그리고 이 테마를 특정 액티비티나 전체 어플리케이션에 적용되도록 할 수 있다.

스타일과 테마는 자원 중 하나이다. 안드로이드는 개발자가 적용시킬 수 있는 여러 스타일과 테마를 제공하며, 개발자만의 임의 스타일 및 테마 자원을 정의해서 사용할 수도 있다.

댓글 없음:

댓글 쓰기