Home » Android -8. 여러가지 위젯

Android -8. 여러가지 위젯

8.1. 웹뷰

  • 웹 페이지를 보여주는 위젯으로, 네트워크 입출력, 캐싱, 링크 클릭 처리, 확대, 축소, 히스토리 관리 등 웹브라우저가 제공하는 모든 기능을 자체적으로 제공.
  • 안드로이드 내장 웹킷(WebKit)라이브러리가 모든 것을 처리, 웹킷은 오픈 소스이며 사파리, 크롬등에 채용되어 이미 성능 입증,신뢰성이 높다.

<퍼미션 등록>

<AndroidManifest.xml>
[php]
<uses-permission android:name="android.permission.INTERNET" />

<webview_sample.xml>
<WebView
android:id="@+id/webViewSampleWebView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
[/php]

< step6/WebViewSample >
[php]
webView = (WebView)findViewById(R.id.webViewSampleWebView);
… 생략
webView.getSettings().setJavaScriptEnabled(true); (1)
… 생략
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.webViewSampleButton1 :
// 로드할 페이지 설정
webView.loadUrl("http://www.google.com"); (2)
break;
case R.id.webViewSampleButton2 :
webView.loadUrl("file:///android_asset/html/hello.html"); (3)
break;
}}
[/php]

번호 설명
(1) Java script 적용 할 것인지 설정
(2) 일반 웹 페이지를 여는 경우
(3) 직접 파일을 만들어 여는 경우

8.2. 메뉴

  • 보통 안드로이드는 홈버튼, 이전(취소)버튼, 메뉴버튼을 가지고 있다.
  • 이 중 메뉴 버튼을 눌렀을 때 나타는 것을 옵션메뉴 또는 메뉴라고 한다.
  • 화면이 한정적이기 때문에 제공하는 컨텐츠가 많아지면 화면에 모두 표시하기 힘들기 때문에 메뉴를 통해 다른 컨텐츠로 이동할 수 있도록 할 수 있다.

<menu/menu_sample.xml>
[php]
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item (1)
android:id="@+id/menu_sample1"
android:orderInCategory="200" (2)
android:showAsAction="never" (3)
android:title="@string/menu_sample1"/> (4)
… 생략
</menu>
[/php]

번호 설명
(1) 하나의 메뉴는 안에 정의 된다.
(2) 메뉴는 add 되는 순서대로 들어가는 데 이 속성을 통해 순서를 바꾸어 줄 수 있다.
(3) 아래 참고 사항 참조
(4) 메뉴의 타이틀 지정

(3)
ifRoom : 액션 아이템을 표시할 수 있는 공간이 있다면 액션 아이템을 표시.
never : 항상 액션 아이템으로 표시하지 않는다. (기본값)
withText : 메뉴 항목의 아이콘과 메뉴 항목의 텍스트를 함께 액션 아이템으로 표시.
always : 항상 액션 아이템으로 표시한.

<step6/MenuSample>
[php]
// menu_sample.xml에 정의한 내용을 가져온다
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_sample, menu); (1)
return true;
}

// 해당 메뉴가 눌러졌을 때 불려지는 메소드
@Override
public boolean onOptionsItemSelected(MenuItem item) { (2)

switch(item.getItemId()) { (3)
case R.id.menu_sample1 :
ToastUtil.show(MenuSample.this, "selected menu 1");
break;

case R.id.menu_sample2 :
ToastUtil.show(MenuSample.this, "selected menu 2");
break;
… 생략
return true;
}
[/php]

번호 설명
(1) 인자로 지정 된 menu_sample.xml의 정보를 가져온다.
(2) 각 메뉴를 선택 했을 때 호출되는 메소드로 item 객체를 인자로 받아온다.
(3) 받아온 인자의 id를 통해 분기


그림 27. Menu

8.3. 액션바

  • 액션바는 기존 안드로이드 애플리케이션의 타이틀바(Title bar)를 대체하는 컴포넌트로, 기존 타이틀바가 단순히 제목만을 표시하거나 간단한 정보만을 표시할 수 있던 것에 반해 액션바는 제목 표시 뿐만 아니라 메뉴 제공, 액션 아이템(Action item)을 통한 단축 메뉴 제공, 탭 지원 등 다양한 기능을 포함하고 있다. * 다음은 전형적인 액션바의 모습을 보여준다.

<actionbar_sample.xml>
[php]
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
android:showAsAction="always"
android:id="@+id/actionBarSampleItem1"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/actionbar_sample_add_txt"
/>
<item
android:id="@+id/actionBarSampleItem2"
android:showAsAction="always"
android:title="@string/actionbar_sample_search_txt"
android:icon="@android:drawable/ic_menu_search"
/>
<item
android:title="@string/actionbar_sample_normal_txt"
android:id="@+id/actionBarSampleItem3"
/>

</menu>
[/php]

<step6/ActionBarSample>
[php]
// 액션바 가져오기
actionBar = getActionBar(); (1)
actionBar.show(); (2)
… 생략
// menu/actionbar_sample.xml 안의 정보 생성
@Override
public boolean onCreateOptionsMenu(Menu menu) { (3)
getMenuInflater().inflate(R.menu.actionbar_sample, menu);
return true;
}
// 해당 메뉴가 눌려졌을 때 실행되는 메소드
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.actionBarSampleItem1:
ToastUtil.show(ActionBarSample.this, "selected add item");
break;

case R.id.actionBarSampleItem2:
ToastUtil.show(ActionBarSample.this, "selected search item");
break;

case R.id.actionBarSampleItem3:
ToastUtil.show(ActionBarSample.this, "selected nomal item");
break;
}
return true;
}
[/php]

번호 설명
(1) ActionBar 객체 가져오기
(2) ActionBar를 보여줌
(3) 각 메뉴를 생성한다.


그림 28. Action bar

8.4. 액션바를 이용한 탭 구현

<actionbar_tab_sample.xml>
[php]
<LinearLayout
android:id="@+id/actionbar_sample_fragment_area"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
/>
[/php]
<step6/ActionBarTabSample>
[php]
public class ActionBarTabSample extends Activity implements ActionBar.TabListener{ (1)
… 생략
actionBar = getActionBar(); (2)
// 탭모드로 설정
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); (3)
// 탭 생성 및 설정
Tab tab1 = actionBar.newTab(); (4)
tab1.setText("Tab 1"); (5)
tab1.setTabListener(this); (6)
tab1.setTag("tab1"); (7)

// 탭 생성 및 설정
Tab tab2 = actionBar.newTab();
tab2.setText("Tab 2");
tab2.setTabListener(this);
tab2.setTag("tab2");

… 생략
// 액션바에 탭 추가
actionBar.addTab(tab1); (8)
actionBar.addTab(tab2);
actionBar.addTab(tab3);

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) { (9)
}

// 선택한 탭에 따라 화면 바꿈
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) { (10)
Fragment fragment = null;
if(tab.getTag().equals("tab1")) {
fragment = new ActionBarTabSampleTab1(); (11)

}else if(tab.getTag().equals("tab2")) {
fragment = new ActionBarTabSampleTab2();
} else if(tab.getTag().equals("tab3")) {
fragment = new ActionBarTabSampleTab3();
}
ft.replace(R.id.actionbar_sample_fragment_area, fragment); (12)
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) { (13)
}
[/php]

번호 설명
(1) 리스너 구현을 위함
(2) 액션바 가져옴
(3) 액션바를 탭모드로 설정
(4) 하나의 탭 생성
(5) 이름 설정
(6) 리스너 등록
(7) 태그 설정
(8) 액션바에 탭 추가
(9) 탭이 재 선택 되었을 때 실행 되는 메소드
(10) 탭이 선택 되었을 때 실행 되는 메소드
(11) 탭의 등록한 태그를 비교하여 선택 된 탭의 내용을 담은 프래그먼트 생성
(12) 프래그먼트 영역으로 지정한 레이아웃에 프래그먼트 교체
(13) 탭이 선택 되지 않았을 때 호출 되는 메소드

<step6/ActionBarTabSampleTab1>
<step6/ActionBarTabSampleTab2>
<step6/ActionBarTabSampleTab3>

  • 소스 내용을 같으며 클래스의 이름과 레이아웃의 이름만 바뀌므로 tab1만 기록한다.
    [php]
    public class ActionBarTabSampleTab1 extends Fragment { (1)
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) { (2)
    View rootView = inflater.inflate(R.layout.actionbar_tab_sample_tab1, container, false); (3)

    return rootView;
    }
    }
    [/php]

    번호 설명
    (1) 프래그먼트를 상속 받은 클래스로 각 탭을 눌렀을 때 나타나는 화면
    (2) 뷰가 만들어질 때 호출 되는 메소드
    (3) 레이아웃의 정보를 가져와 객체로 생성




그림 29. ActionBar Tab

8.5. 탭 호스트를 이용한 탭 구현

<tab_host_sample.xml>
[php]
<TabHost (1)
android:id="@+id/tab_host"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TabWidget (2)
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
/>

<FrameLayout (3)
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<RelativeLayout
android:id="@+id/tab_view1"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tab_host_sample_tab1_txt"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:textSize="20sp"
android:textStyle="bold"
/>
… 생략

</FrameLayout>
</TabHost>

</LinearLayout>
[/php]

번호 설명
(1) 탭 호스트 레이아웃
(2) 탭들이 들어갈 영역
(3) 탭이 눌렸을 때 바뀌는 화면 영역

<step6/TabHostSample>
[php]
TabHost tabHost = (TabHost)findViewById(R.id.tab_host); (1)
tabHost.setup(); (2)

// Tab1 Setting
TabSpec tabSpec1 = tabHost.newTabSpec("Tab1"); (3)
tabSpec1.setIndicator("신문, 뉴스"); // Tab Subject (4)
tabSpec1.setContent(R.id.tab_view1); // Tab Content (5)
tabHost.addTab(tabSpec1); (6)
… 생략

// show First Tab Content
tabHost.setCurrentTab(0); (7)
[/php]

번호 설명
(1) 탭 호스트 객체 생성
(2) 탭호스트 셋업
(3) 하나의 탭 생성
(4) 탭 이름 설정
(5) 탭을 눌렀을 때 바꿀 레이아웃 설정
(6) 탭호스트에 생성한 탭을 붙임
(7) 탭을 선택 한다. 0의 경우 첫번째 탭을 의미




그림 30. TabHost를 이용한 탭

8.5. 프로그레스바

  • 시간이 걸리는 처리를 할 때에 진행 정도를 나타내주는 위젯
  • 표현하는 방법에는 원형 프로그레스바, 막대형 프로그레스바, 다이얼로그 형식의 프로그레스바 등이 있다.

(1) 막대형 프로그레스바

<progress_bar_sample.xml>
[php]
<ProgressBar
android:id="@+id/progressBarSampleBar2"
style="?android:attr/progressBarStyleHorizontal" (1)
android:layout_width="300dp"
android:layout_height="wrap_content" />
[/php]

번호 설명
(1) 막대형 프로그레스바 설정

<step6/ProgressBarSample>
[php]
stickPb = (ProgressBar) findViewById(R.id.progressBarSampleBar2);
… 생략
public synchronized void startProgressBarThread() {
if(theProgressBarThread1 == null) {
// 쓰레드 생성
theProgressBarThread1 =
new Thread(null, backgroundThread1, "startProgressBarThread");
currentPosition = 0;
// 쓰레드 시작
theProgressBarThread1.start();
}
}

public synchronized void stopProgressBarThread() {
if(theProgressBarThread1 != null) {
Thread tmpThread = theProgressBarThread1;
theProgressBarThread1 = null;
tmpThread.interrupt();
}
// 쓰레드가 종료 되면 프로그레스바를 감추고 toggle button 체크 해제
stickPb.setVisibility(ProgressBar.GONE);
stickButton.setChecked(false);
// 버튼을 다시 그려줌
stickButton.invalidate();
}

private Runnable backgroundThread1 = new Runnable() {
public void run() {
if(Thread.currentThread() == theProgressBarThread1) {
currentPosition = 0;
final int total = 100;
while(currentPosition < total) {
try {
// 0.1초에 한번씩 핸들러에 메세지를 보낸다
progressBarHandle.sendMessage(progressBarHandle.obtainMessage()); (1)
Thread.sleep(100); (2)
} catch(final InterruptedException e) {
return;
} catch(final Exception e) {
return;
}

}
}
}
};

Handler progressBarHandle = new Handler() { (3)
public void handleMessage(Message msg) { (4)
currentPosition++;
Logger.i("in handle");
stickPb.setProgress(currentPosition); (5)
stickButton.setText("" + currentPosition + "%");
if(currentPosition == 100) {
stopProgressBarThread(); (6)
}
};
};
[/php]

번호 설명
(1) 핸들러에 메시지를 보냄
(2) 0.1초 딜레이 시킴
(3) 핸들러 생성
(4) 메시지를 받았을 때 실행 되는 메소드
(5) 프로그레스바의 진행정도 설정
(6) 쓰레드 중지 메소드 호출

(3)
* 안드로이드는 메인 쓰레드에서의 UI작업이 불가능 하기 때문에 핸들러를 사용하는데, 이 핸들러는 이후 자세히 다루도록 함

(2) 원형 프로그레스바

<progress_bar_sample.xml>
[php]
<ProgressBar
android:id="@+id/progressBarSampleBar1"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
[/php]

<step6/ProgressBarSample>
[php]
circlePb = (ProgressBar) findViewById(R.id.progressBarSampleBar1);
[/php]
* 원형 프로그레스바의 경우 계속 원형으로 돌기만 하기 때문에 별다른 진행 정도 처리를 하지 않아도 작동하는 것을 확인 할 수 있다.


그림 31. 프로그레스바(막대형, 원형)

(3) 다이얼로그 형태의 막대형 프로그레스바

<step6/ProgressBarSample>
[php]
stickDialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startProgressBarThread2();
}
});

public synchronized void startProgressBarThread2() {
if(theProgressBarThread2 == null) {
theProgressBarThread2 =
new Thread(null, backgroundThread2, "startProgressBarThread2");
currentPosition2 = 0;
theProgressBarThread2.start();
// 막대형 프로그레스바 생성
progressDialog = new ProgressDialog(act); (1)
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); (2)
progressDialog.setMessage("wait…"); (3)
// 1씩 증가하도록 설정
progressDialog.incrementProgressBy(1); (4)
progressDialog.setMax(100); (5)
// 초기 프로그레스바 상태 0으로 설정
progressDialog.setProgress(0); (6)
progressDialog.show(); (7)
}
}

public synchronized void stopProgressBarThread2() {
if(theProgressBarThread2 != null) {
Thread tmpThread = theProgressBarThread2;
theProgressBarThread2 = null;
tmpThread.interrupt();
}
if(progressDialog != null) {
progressDialog.dismiss();
}
}

private Runnable backgroundThread2 = new Runnable() {
public void run() {
if(Thread.currentThread() == theProgressBarThread2) {
currentPosition2 = 0;
final int total = 100;
while(currentPosition2 < total) {
try {
// 0.1초에 한번씩 핸들러에 메세지 보냄
progressBarHandle2.sendMessage(progressBarHandle2.obtainMessage()); (8)
Thread.sleep(100); (9)
} catch(final InterruptedException e) {
return;
} catch(final Exception e) {
return;
}
}
}
}
};

Handler progressBarHandle2 = new Handler() {
public void handleMessage(Message msg) {
currentPosition2++;
progressDialog.setProgress(currentPosition2); (10)
progressDialog.setMessage("ProgressBar …" + currentPosition2 + "%"); (11)
if(currentPosition2 == 100) {
stopProgressBarThread();
}
}
};
[/php]

번호 설명
(1) 다이얼로그 형태의 프로그레스바 생성
(2) 프로그레스바의 형태를 막대형으로 설정
(3) 메시지 설정
(4) 진행도가 1씩 증가 하도록 설정
(5) 최대값을 100으로 설정
(6) 초기 진행도를 0으로 설정
(7) 다이얼로그를 띄운다
(8) 핸들러에 메시지 전송
(9) 0.1 딜레이
(10) 프로그레스바의 진행도 설정
(11) 메시지 설정


그림 32. 다이얼로그 막대 프로그레스바

(4) 다이얼로그 형태의 원형 프로그레스바

<step6/ProgressBarSample>
[php]
circleDialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 다이얼로그 생성 및 종료
startLoading(act); (1)
endLoading(); (2)
}
});

public void startLoading(Context ctx) { (3)
if(loadingDialog == null) {
// 다이얼로그 생성
loadingDialog = ProgressDialog.show(ctx, "Loading…", "Please wait…", false, true);
}
}

public void endLoading() {
EndLoader endLoader = new EndLoader(); (4)
// 다이얼로그가 5초후 종료 되도록 타이머 설정
Timer timer = new Timer(false); (5)
timer.schedule(endLoader, 5000); (6)
}

class EndLoader extends TimerTask { (7)
@Override
public void run() {
if(loadingDialog != null) {
// 다이얼로그 종료
loadingDialog.dismiss();
loadingDialog = null;
}
}
}
[/php]

번호 설명
(1) 다이얼로그 원형 프로그레스바 생성하는 메소드 호출
(2) 다이얼로그를 종료시켜주기 위한 메소드 호출(타이머 형태)
(3) 다이얼로그 원형 프로그레스바 생성
(4) 타이머를 상속받은 runnable 객체 생성
(5) 타이머 객체 생성
(6) 타이머 객체에 runnable객체와 시간을 인자로 하여 실행
(7) 타이머를 상속받은 runnable 객체

8.6. 대화상자

  • 대화상자는 기본적인 Text부터 별도의 복잡한 View까지를 별도의 modal dialog에 담아 사용자에게 notify하는데 사용되며, 대표적으로 AlertDialog가 있다.
  • Toast와는 다르게 AlertDialog는 사용자가 하던 작업으로부터 focus를 빼앗아 사용자가 하던 작업을 방해 하기 때문에 사용자에게 반드시 알려야 할 중요한 메시지가 있을 때만 사용하는 것이 좋다.

(1) 경고 / 알림 다이얼로그

<step6/DialogSample>
[php]
public void yesOrNoDialog(Context context) {
AlertDialog.Builder dialog = new AlertDialog.Builder(context); (1)
dialog.setTitle("Dialog"); (2)
dialog.setMessage("contents"); (3)
// confirm 버튼 리스너
dialog.setPositiveButton("confirm", new DialogInterface.OnClickListener() { (4)
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.show(DialogSample.this, "clicked positive button");
dialog.dismiss();
}
});
// cancel 버튼 리스너
dialog.setNegativeButton("cancel", new DialogInterface.OnClickListener() { (5)

@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.show(act, "clicked negative button");
dialog.cancel();
}
});
dialog.show(); (6)

}
[/php]

번호 설명
(1) AlertDialog 생성
(2) 타이틀 설정
(3) 메시지 설정
(4) 확인 버튼에 대한 리스너
(5) 취소 버튼에 대한 리스너
(6) 다이얼로그 띄움


그림 34. 경고 / 알림 다이얼로그

(2) single choice 다이얼로그

<step6/DialogSample>
[php]
public void singleChoiceDialog(Context context) {
final String items[] = {"item 1", "item 2", "item 3"}; (1)
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle("single choice dialog");
dialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { (2)
@Override
public void onClick(DialogInterface dialog, int which) {
// 리스트를 선택했을 때
ToastUtil.show(act, (which+1) + "번째를 선택했습니다.");

}
})
// confirm 버튼 리스너
.setPositiveButton("confirm", new DialogInterface.OnClickListener() { (3)
@Override
public void onClick(DialogInterface dialog, int which) {
// confirm 버튼을 눌렀을 때
int index = ((AlertDialog)dialog).getListView().getCheckedItemPosition();
ToastUtil.show(act, "clicked confirm, checked item : " + items[index]);
dialog.dismiss();
}
})
// cancel 버튼 리스너
.setNegativeButton("cancel", new DialogInterface.OnClickListener() { (4)
@Override
public void onClick(DialogInterface dialog, int which) {
// cancel 버튼을 눌렀을 때
ToastUtil.show(act, "clicked cancel");
dialog.cancel();
}
});
dialog.show();
}
[/php]

번호 설명
(1) Select list에 나타날 항목들
(2) 하나의 선택만 가능한 목록을 나타내는 화면이 나오도록 설정 및 항목 선택시의 리스너 구현
(3) 확인 버튼 리스너. 몇번째 항목을 눌렀는지 인자로 받는다.
(4) 취소 버튼 리스너


그림 35. Single choice 다이얼로그

(3) multi choice 다이얼로그

<step6/DialogSample>
[php]
public void multiChoiceDialog(Context context) {
final String items[] = {"item 1", "item 2", "item 3"};
final boolean[] checkedItems = {false, false, false}; (1)

AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle("multi choice dialog");
dialog.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() { (2)
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) { (3)
ToastUtil.show(act, (which+1) + " : " + isChecked);

}
})
.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String states = "";
for(boolean state : checkedItems) {
states += String.valueOf(state) +" ";
}
ToastUtil.show(act, states);
dialog.dismiss();
}
})

.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// cancel 버튼을 눌렀을 때
ToastUtil.show(act, "clicked cancel");
dialog.cancel();
}
});

dialog.show();

}
[/php]

번호 설명
(1) 각 체크 항목의 체크 여부를 저장하는 배열
(2) 여러 항목을 선택 가능한 화면 설정 및 리스너 구현
(3) 항목이 체크 되었을 때 체크여부와 항목의 index값을 받아온다.


그림 36. Multi choice 다이얼로그

(4) date picker 다이얼로그

<step6/DialogSample>
[php]
public void datePickerDialog(Context context) {
Calendar cal = Calendar.getInstance();
mYear = cal.get(Calendar.YEAR);
mMonth = cal.get(Calendar.MONTH);
mDay = cal.get(Calendar.DAY_OF_MONTH);

DatePickerDialog dialog =
new DatePickerDialog(act, mDateSetListener, mYear, mMonth, mDay); (1)
dialog.setOnDismissListener(new OnDismissListener() { (2)
@Override
public void onDismiss(DialogInterface dialog) {
ToastUtil.show(act, "date => " + mYear + "/" + mMonth + "/" + mDay);
}
});
dialog.show();
}

// date picker 날짜 변화 리스너
private DatePickerDialog.OnDateSetListener mDateSetListener = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { (3)
mYear = year;
mMonth = monthOfYear+1;
mDay = dayOfMonth;
}
};
[/php]

번호 설명
(1) 날짜를 나타내는 다이얼로그 생성
(2) 다이얼로그가 종료될 때 리스너
(3) 날짜가 변화할 때 불려지는 메소드


그림 37. Date picker 다이얼로그

(5) time picker 다이얼로그

<step6/DialogSample>
[php]
public void timePickerDialog(Context context) {
Calendar cal = Calendar.getInstance();
mHour = cal.get(Calendar.HOUR_OF_DAY);
mMinute = cal.get(Calendar.MINUTE);
TimePickerDialog dialog =
new TimePickerDialog(act, mTimeSetListener, mHour, mMinute, true); (1)
dialog.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
ToastUtil.show(act, "time => " + mHour + ":" + mMinute);
}
});
dialog.show();
}

// time picker 시간 변화 리스너
private TimePickerDialog.OnTimeSetListener mTimeSetListener = new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) { (2)
mHour = hourOfDay;
mMinute = minute;
}
};
[/php]

번호 설명
(1) 시간을 나타내는 다이얼로그 생성
(2) 시간이 바뀔 때 호출 되는 메소드


그림 38. Time picker 다이얼로그