<<4장 정리>>

 

※ 기본적인 안드로이드 UI요소(뷰, 뷰그룹, 레이아웃 사용법)에 대한 내용.


-기본적인 안드로이드 UI 디자인

뷰: 비주얼 인터페이스 요소를 위한 사용자 인터페이스 클래스.

뷰 그룹: 여러개의 자식뷰를 담을 수 있는 뷰 클래스의 확장.

액티비티: 사용자에게 보여지는 윈도우나 화면.


-뷰소개 

안드로이드에 있는 모든 비주얼 컴포넌트는 View 클래스로 부터 내려오며, 이들을 총칭 뷰라고 함.

재사용 가능한 컴포넌트(위젯)를 만들거나 자식 뷰의 레이아웃을 관리하는 데 사용.


뷰를 사용해 액티비디 사용자 인터페이스 만들기

레이아웃 리소스의 사용은 애플리케이션 로직에서 프레젠테이션 계층을 분리하여, 코드변경 없이 프레젠테이션을 바꾸는 유연성을 제공.


안드로이드 위젯 도구 상자

*표준 뷰 도구 상자(toolbox)

TextView: 표준 읽기 전용 텍스트 레이블.

EditText: 편집 가능한 텍스트 입력 박스.

ListView: 항목을 리스트에 나타내는 데 사용되는 뷰들의 그룹을 생성하고 관리하는 뷰 그룹.

Spinner: TextView 및 그와 연관된 ListView를 표시하는 복합 컨드롤.

Button: 표준 푸시 버튼.

CheckBox: 확인이나 미확인으로 표현되는 두가지 상태를 갖는 버튼.

RadioButton: 두 가지 상태를 갖는 버튼들의 모음.

(위젯 목록: http://developer.android.com/guide/tutorials/views/index.html)


-레이아웃 소개

ViewGroup클래스의 확장으로 레이아웃을 조합해 임의의 복잡한 인터페이스를 만들 수 있음.

*레이아웃

FrameLayout: 가장 단순한 레이아웃 관리자. 가각의 자식뷰를 좌상단 모서리에 고정.

LinearLayout: 각각의 상대적인 크기를 제어하는 "가중치weight"를 지정할 수 있음.

RelativeLayout: 자식 뷰 각각의 위치를 서로에 대해 그리고 화면 경계에 대해 상대적으로 정의할 수 있음.

TableLayout: 행과 열의 격자를 사용해 뷰를 배치하도록 해줌.

AbsolutLayout: 절대 좌표로 정의. 동적으로 조절 불가.


레이아웃 사용하기

선호되는 방법은 XML로 구현하는 것. 

레이아웃 XML은 반드시 단일 루트 엘리먼트를 가져야함.

뷰와 액티비티 코드에서 프레젠테이션 계층을 분리.


-새로운 뷰 만들기

사용자 인터페이스를 디자인할 때는 미학과 사용성의 균형을 맞추는 것이 중요.

친숙함이, 번드르르한 위젯보다 종종 더 나은 사용성을 제공할 수 있음.

 

* 새로운 뷰를 만들 때의 접근법 

기존 컨트롤의 이벤트 핸들러와 onDraw를 재정의한 커스터 마이즈.

컨트롤들의 결함.

완전히 새로운 컨트롤의 생성.


기존 뷰 수정하기

골격 코드에서 onDraw 메서드와 onKeyDown 핸들러 재정의하여 뷰의 겉모습을 수정.

할 일 목록 커스터마이즈하기


복합 컨트롤 만들기

복합 컨트롤은 원자적이면서도 재사용 가능한 위젯.

레이아웃 리소스를 사용하는 방법이 선호.


커스텀 위젯과 컨트롤 만들기

완전히 새로운 뷰를 만드는 것.

극도로 빠른 다시 그리기와 3D 그래픽스가 요구되지 않는 상황에서는 View 기본 클래스가 강력하면서도 가벼운 해결책을 제공.


새 비주얼 인터페이스 만들기

기본 View 클래스는 100*100픽셀 크기의 텅빈 정사각형을 제공.

onMeasure와 onDraw메서드를 재정의할 필요가 있음.


컨트롤 그리기

객체의 반복적인 생성과 소멸을 피하는 것이 효율적인 코드를 만듬.

안드로이드는 벡터 그래픽스 미지원.


컨트롤 크기 바꾸기

widthMeasureSpec과 heightMeasureSpec은 효율성을 이유로 정수로 전달되며, getMode와 getSize 메서드를 사용해 디코드될 필요가 있음.


사용자 상호작용 이벤트 다루기

*가상 이벤트 핸들러

onKeyDown: D-패드, 키보드, 전화끊기 버튼, 통화 버튼, 뒤로 가기 버튼, 카메라 버튼 등의 장치 키가 눌리면 호출됨.

onKeyUp: 사용자가 눌렀던 키를 놓을 때 호출됨.

onTrackballEvent: 장치의 트랙볼이 움직일 때 호출 됨.

onTouchEvent: 터치 스크린을 누르거나 뗄 때 혹은 이동이 감지될 때 호출 됨.



커스텀 컨트롤 사용하기

자신만의 커스텀 뷰를 만들면 이를 다른 안드로이드 컨트롤처럼 코드와 레이아웃에서 사용할 수 있음.

하나의 레이아웃 안에서 같은 컨트롤을 사용하려면,  레이아웃 정의에 새로운 노드를 만들 때 정규화된 클래스 이름을 지정.


-메뉴만들고 사용하기

각 액티비티는 장치의 메뉴 버튼이 눌릴 때 표시될 자신만의 액티비티 메뉴를 지정할 수 있음.

또한 액티비티 안에 있는 어떠한 뷰에도 할당될 수 있는 컨텍스트 메뉴 역시 지원함.


안드로이드 메뉴 시스템 소개

아이콘메뉴: 아이콘 메뉴 항목에는 체크박스나 라디오 버튼을 할당하지 않는 것이 일반적으로 좋은 습관임.

확장메뉴: 아이콘 메뉴에서 자세히 메뉴 항목을 선택할 때 나타남. 전체 텍스트와 단축키 그리고 체크 박스/라디오 버튼을 적절히 보여줌. 안드로이드가 아이콘 메뉴 대신 학장 메뉴를 나타내도록 강제할 수 없음.

하위메뉴:  각 하위메뉴는 부동 윈도우로 나타냄. 중첩된 하위메뉴를 지원하지 않음. 하위 메뉴 항목에는 아이콘이 출력되지 않으므로 아이콘 할당을 피하는 것이 좋음.


액티비티 메뉴 정의하기

액티비티를 위한 메뉴를 정의하려면 onCreateOptionsMenu 메서드를 재정의함.

기본 구현은 추가 시스템 메뉴 옵션을 적절한 곳에 자동으로 포함하기 때문에, 항상 기본 구현을 통해 호출해야함.

메뉴를 채우려면 Menu 객체에 add 메서드를 사용. 

각 메뉴 항목마다 반드시 다음과 같은 것을 지정함.

¤ 일괄 처리와 순서 매김을 위해 메뉴 항목들을 구분하기 위한 그룹 값.

¤ 각 메뉴 항목에 대한 유일한 식별자. 

¤ 메뉴 항목이 출력되는 순서를 정의하는 순서 값.

¤ 문자열이나 문자열 리소스로 된 메뉴 텍스트.

메뉴 항목 옵션

체크 박스와 라디오 버튼: 메뉴 항목을 체크 박스로 설정하려면 setCheckable 메소드를 사용. 이 체크박스의 상태는 setChecked로 제어 됨.

단축키: setShortcut 호출은 두 개의 단축 키를 필요로 함. 대소문자를 구분.(키패드, 풀키보드)

간결한 제목: 상태를 나타내기 위한 출력 텍스트의 수정이 종종 필요.

아이콘: 메뉴항목에 사용되는 아이콘에 대한 드로어블 리소스 식별자.

메뉴 항목 클릭 리스너: 메뉴 항목이 선택 시 실행할 이벤트 핸들러. 효율성을 이유로 사용이 권장되지 않음.

인텐트: 메뉴 항목 클릭이 MenuItemClickListener나 액티비티의 onOptionsItemSelected 핸들러에 의해 처리되지 않을 때 발생 됨.

 

동적으로 메뉴 항목 업테이트하기

액티비티의 onPrepareOptionsMenu 메서드를 재정의하면, 메뉴가 표시될 때마다 애플리케이션 상태에 기반해 메뉴를 수정할 수 있음.


메뉴 선택 처리하기

안드로이드는 액티비티의 모든 메뉴 아이템 선택을 onOptionsItemSelected 메서드라는 단일 이벤트 핸들러를 사용함.


하위 메뉴와 컨텍스트 메뉴


하위 메뉴 만들기

하위 메뉴는 더 많은 항목을 나타내는 보통의 메뉴 항목처럼 표시됨.

addSubMenu 메서드로 추가.


컨텍스트 메뉴 사용하기 & 만들기

특정 뷰를 위한 컨텍스트 메뉴를 만들기 위해 사용할 수 있는 옵션에는 두가지가 있음.

1. onCreateContextMenu 핸들러를 재정의해, View 클래스에 대한 일반적인 컨텍스트 메뉴를 만드는 것.

2. onCreateContextMenu 메서드를 재정의하고, 이를 사용해야 하는 뷰를 등록함으로써 액티비디 전용 컨텍스트 메뉴를 만드는 것.

안드로이드는 인텐트 필터를 사용한 컨텍스트 메뉴의 늦은 런타임 채움을 지원함.


컨텍스트 메뉴 선택 다루기

액티비티 메뉴와 유사함.

각 메뉴 항목에 인텐트 또는 메뉴 항목 클릭 리스너를 직접 부착하거나 액티비티에 onContextItemSelected 메서드를 재정의하는 기법을 사용할 수 있음.