달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2010. 4. 5. 13:23

'10.04.04 Story Android 이야기2010. 4. 5. 13:23

고급 위젯과 컨테이너

 

날짜 색상 선택

안드로이드SDK는 추가적으로 날짜와 시간 등을 입력할 수 있는 전용 위젯인 DatePicker, TimePicker나 DatePickerDialog,TimePickerDialog등의 대화 상자 클래스를 제공한다.

 

TimePicker와 TimePickerDialog 역시 다음과 같은 기능을 제공한다

사용자가 값을 변경하기 전에 원하는 시와 분을 초기 시작으로 지정할 수 있다.

화면에 시각을 표시할 때, 12시간제 오전/오후 선택 기능을 표시할지, 아니면 24시간제로 표시할지 설정할 수 있다.

onTimeChangedListener나 onTimeSetListener 리스너를 t용해 사용자가 선택한 시와 분값을 이벤트로 받을 수 있다.

 

진행상태 표시

긴 시간동안 처리해야 할 작업이 있다면, 대략 아래와 같은 두 가지 방법을 통해 사용자가 불편해하지 않도록 처리할 수 있다.

 

백그라운드 스레드를 사용해 해당 작업을 처리한다. 15장에서 자세한 내용을 소개한다

진행되는 상황을 계속해서 사용자에게 알린다. 진행 상황을 알려주지 않으면 사용자는 작업이 제대로 동작하지 않았고, 원하는 결과를 얻을 수 없다고 생각하게 된다.

 

안드로이드에서는 ProgressBar 위젯을 써서 진행상황을 표시할 수 있다.

ProgressBar위젯은 0부터 시작되는 정수값으로 현재의 진행 정도를 설정한다. 작업이 완료되는 시점에 해당하는 정수값은 setMax() 메소드를 사용해 지정한다. 기본적으로는 진행 상태가 0부터 시작되지만, setProgress() 메소드를 사용하면 진행 상황을 얼마든지 원하는 값으로 설정 가능하다.

상황에 따라 종료 시점이 명확하지 않은 경우네는 setIndeterminate()메소드에 true값을 넘겨주면 진행 상황에 관계없이 계속해서 작업 중이라고 표현할 수 있다.

 

ProgressBar 위젯을 사용할 때는 백그라운드 스레드와 밀접한 관련이 있다.

즉 백그라운드 스레드가 작업을 계속 진행하고, 그에 따라 진행되는 상황을 ProgressBar에 계속해서 업데이트하는 구조이다.

 

탭구성요소

TabHost 클래스 : 탭 버튼과 탭 내용을 아우르는 전체 탭 컨테이너

TabWidget 클래스 : 탭 버튼 목록을 관리한다. 탭 버틍느 텍스트 문자열이 들어가고, 필요한 경우에는 아이콘을 설정할 수도 있다.

FrameLayout 컨테이너 : 탭 내용을 관리한다. 각 탭 내용은 FrameLayout내부에 하나의 위젯으로 들어간다.

 

주의할점

TabWidget 엘리먼트의 android:id값은 @android:id/tabs로 지정해야 한다

탭 버튼과 내용이 구분되도록 FrameLayout 상단에 약간의 여백을 지정해야 한다.

TabActivity 클래스를 사용하려면 TabHost 엘리먼트의 android:id값을 @android:id/tabhost라고 지정해야 한다.

 

연결과 탭 완성

자바 프로그램에서 탭 내용은 어느 엘리먼트에 들어 있고, 탭 버튼은 어떤 형태로 표시해야 한다는 등의 내용을 tabHost에 설정해야 한다. 이와 같은 설정은 모두 TabSpec객체에 들어간다. TabSpec 인스턴스는 TabHost인스턴스에서 newTabSpec()메소드를 호출해 생성하고, 그 내용을 채운 다음 적절한 순서에 맞춰 TabHost인스턴스에 다시 설정한다.

 

TabSpec에서는 아래에 소개하는 두 개의 메소드가 중요한 역할을 담당한다

setContent()메소드 : 해당하는 탭 내용으로 어떤 항목이 들어가는지를 지정한다. 일반적으로는 해당하는 탭을 선택했을 때 화면에 표시하려는 엘리먼트의 android:id값을 넘겨준다.

 

setIndicator()메소드 : 탭 버튼에 표시되는 텍스트를 지정하고, 필요한 경우 탭 버튼 옆에 표시할 아이콘도 함께 지정할 수 있다.

 

동적으로 탭 추가

TabWidget을 사용하면 개발할 당시에는 탭을 쉽게 추가할 수 있다.

실행도중에 탭을 동적으로 추가하는 방법 역시 개발할 때 탭을 추가하는 방법과 굉장히 유사하지만 , setContent() 메소드를 호출 할 때 TabHost.TabContentFactory 인스턴스를 넘겨준다. TabContentFactory클래스는 필요할 때 호출되는 콜백 함수를 포함하고 있을 뿐이다. 따라서 TabContentFactory의 createTabContent()메소드를 구현해 setContent()메소드에 넘겨주기만 하면 된다.

package com.example.mydynamictab;

 

 

/*

* 탭 내용에 들어가는 버튼의 setOnClickListener()메소드에 추가한 이벤트 리스너를 보면

* 먼저 TabHost.TabSpec 인스턴스를 하나 생성하고, TabSpec인스턴스의 setContent()메소드를

* 호출할 때 TabHost.TabContentFactory인스턴스를 하나 생성해 함께 넘겨준다.

* TabContentFactory 클래스는 해당하는 탭 내용에 들어갈 위젯을 생성하는 기능을 담당하는데,

* 이번 예제에서는 AnalogClck위젯을 하나 생성하게 돼있다.

* 탭 내용을 생성하는 부분에 LayoutInflater등을 적용하면 훨씬 유용한 방법으로 탭을 추가할 수 있다.

*/

public class MyDynamicTab extends Activity {

 

 

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

 

final TabHost tabs = (TabHost)findViewById(R.id.tabhost);

tabs.setup();

 

TabSpec spec = tabs.newTabSpec("buttontab");

spec.setContent(R.id.buttontab);

spec.setIndicator("버튼");

tabs.addTab(spec);

 

tabs.setCurrentTab(0);

 

Button btn = (Button)tabs.getCurrentView().findViewById(R.id.buttontab);

btn.setOnClickListener(new View.OnClickListener() {

 

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

TabSpec spec = tabs.newTabSpec("tag");

 

spec.setContent(new TabHost.TabContentFactory() {

 

@Override

public View createTabContent(String tag) {

// TODO Auto-generated method stub

return new AnalogClock(MyDynamicTab.this);

}

});

 

spec.setIndicator("시계");

tabs.addTab(spec);

 

}

});

}

}

 

메뉴 종류

안드로이드에서는 애플리케이션 수준의 메뉴와 컨텍스트 메뉴를 각각 옵션 메뉴와 컨텍스트 메뉴라고 부른다. 옵션 메뉴는 기기에 붙어 있는 실제 버튼을 클릭해서 띄우게 되어있고, 컨텍스트 메뉴는 메뉴가 연결된 위젯을 화면상에서 터치하고 잠깐동안 떼지 않는 동작으로 띄울 수 있다.

또한 옵션 메뉴는 두가지 형태로 동작하게 돼있는데 하나는 아이콘 형태고, 또 하나는 확장 형태이다.

사용자가 메뉴 버튼을 클릭하면 먼저 아이콘 형태의 메뉴가 전체 화면의 하단에 올라오면서 앞쪽의 여섯 가지 메뉴 항목이 각자 커다란 아이콘으로 격자 구조로 나타낸다. 메뉴의 항목이 6개를 넘어서면 여섯번째 항목 대신 더보기 아이콘이 나타나고, 더 보기 버튼을 클릭하면 확장된 형태의 메뉴가 나타나면서 가능한 모든 항목을 화면에 표시한다. 메뉴 자체도 스크롤 할 수 있게 돼 있으므로, 메뉴 항목이 많더라도 사용자가 얼마든지 선택할 수 있다.

 

옵션 메뉴

onCreateOptionsMenu()메소드를 구현해 메뉴를 추가한다. 인자에는 Menu인스턴스가 넘어올 수 있다.

onCreateOptionsMenu()메소드 내부에서 가장 먼저 해야 할 일은 상위 클래스의 메소드를 호출해(super.onCreateOptionMenu(menu))안드로이드 프레임웍에서 시스템 관련 메뉴 항목을 먼저 추가하게 해야 한다. 상위 클래스를 호출한 이후에는 필요한 메뉴 항목을 직접 추가할 수 있다.

 

메뉴 인플레이션

안드로이드에서는 메뉴 역시 XML레이아웃 파일에 저의해두고 필요할 때 인플레이션으로 메뉴 인스턴스를 생성할 수 있다. 그러면 메뉴 구조를 프로그램이 아닌 외부에 정의해둘 수 있기 때문에 프로그램과 메뉴 구조를 분리할 수 있다.

 

메뉴 XML레이아웃 파일에서는 다음과 같은 점을 주의해야한다

- 가장 최상위 엘리먼트는 반드시 menu이어야 한다

- menu 엘리먼트 안에는 item 엘리먼트나 group엘리먼트가 들어간다. group 엘리먼트는 하나의 그룹으로 동작하는 또 다른 item엘리먼트를 포함한다

- 하위 메뉴는 item엘리먼트 안에 또 다른 menu엘리먼트롤 추가하고, 해당 menu 엘리먼트 안에 하위 메뉴의 메뉴 항목을 item엘리먼트로 추가한다.

- 사용자가 어떤 메뉴 항목을 선택했는지 알아내거나, 또는 메뉴 하옥이나 그룹을 참조하려면 반드시 일반적인 XML레이아웃 파일처럼 android:id 속성을 지정해야 한다.

 

메뉴 관련 속성

메뉴 이름

메뉴 항목 이름은 item엘리먼트의 android:title 속성으로 지정한다

아이콘

메뉴 항목 마다 아이콘을 지정할 수 있다. 아이콘을 지정하려면 item엘리먼트의 android:icon 속성에 해당 아이콘 리소스에 대한 참조(@drawable/eject)

순서

기본적으로 메뉴 항목이 메뉴에 배치되는 순서는 XML에서 먼저 나타난 순서와 동일하다

하지만 경우에 따라 item엘리먼트에 android:orderInCategory속성을 지정해 배치되는 순서를 임의로 지정할 수 있다.

하지만, 일반적으로는 XML레이아웃에 화면에 나타내려는 순서대로 배치하는게 가장 편리하고 알아보기도 좋다.

활성화 여부

메뉴 항목과 그룹은 모두 활성화하거나 비활성화할 수 있다. android:enabled속성으로 지정한다. 기본값으로는 모든 메뉴항목과 그룹이 모두 활성상태이다. 메뉴 항목의 활성상태는 자바 코드에서 MenuItem인스턴스의 setEnabled()메소드로, 그룹의 활성 상태는 Menu 인스턴스의 setGroupEnabled()메소드로 실행 도중에 얼마든지 변경할 수 있다.

화면 표시 여부

활성화 여부와 비슷하게 메뉴 항목 또는 그룹의 화면 표시 또는 숨김 여부도 XML레이아웃 파일에서 android:visible 속성으로 지정할 수 있다. 메뉴 항목은 MenuItem의 setVisible()메소드로, 그룹은 Menu인스턴스의 setGroupVisible() 메소드로 화면 표시 여부를 실행 도중에 얼마든지 변경할 수 있다.

단축키

android:alphabeticShorcut 이나 andorid:numericShortcut으로 단축키를 지정할 수 있다.

 

 

플리퍼

처음 화면에 나타나면 ViewFlipper 에 추가된 첫 번째 위젯을 화면에 추가한다

그리고 다른 화면으로 넘어가는 방법은 개발자에게 달려있다. 사용자가 클릭하면 다른화면으로 넘어갈 수도 있고, 아니면 타이머를 걸어서 일정시간이 지나면 다른 화면으로 넘어게 할 수도 있다

 

'Android 이야기' 카테고리의 다른 글

'10.04.06 Story  (0) 2010.04.06
'10.04.05 story 안드로이드 2주차 과제  (0) 2010.04.05
'10.04.05 Story  (0) 2010.04.05
내 생각 안드로이드 이야기2  (0) 2010.04.05
내 생각 안드로이드  (1) 2010.04.01
:
Posted by НooпeУ


Code Start Code End