|
안드로이드(Android) ProgressBar 진행바 구현하기 |
|
개발환경 : window 7 64bit, Eclipse Kepler, Android 4.2.2 |
ProgressBar 위젯은 원형으로 보이는 Spinner 와 막대형인 Horizontal 이 있다.
용도에 따라 적당하게 선택해서 사용하자. 진행정도를 알려면 막대형이
좋을 것 같고 언제 끝날지 모른다면 원형바가 적당하지 않을까?
진행바를 크게 두가지로 나누었다. 하나는 안드로이드에서 제공하는 위젯으로
구현한 것이고, 다른 하나는 ProgressDialog 을 이용해 작업이 길어질 경우
어떻게 프로그레시브바를 이용하는지 응용 예제를 만들었다.
첫번째 것은 드래그앤드롭으로 컨트롤을 가져다 놓고 쓴 간단한 예제이고
두번째 것은 AsyncTask 클래스를 상속받아 작업시작시 프로그래시브 바를 시작하고
작용종료시 프로그래시브바를 종료하는 구조이다. 실전에서는 첫번째의 간단한
구조보다 두번째의 응용예제가 많이 쓰일 것이다.
|
1. Palette 에서 ProgressBar 위젯 추가하고 구현하기 |
그림에서 보듯이 Spinner 와 ProgressBar 가 있다. 각각의 기능을
알아보기 위해 모두 추가한다.
위에서 보는 것처럼 4가지가 있는데 Large,Normal,Samll 은 원형태의
프로그레스브바이며 크기별로 구분된다.나머지 Horizontal 은 옆으로 진행되는 막대형태의
프로그레스브바이다.
버튼이벤트에 프로그레스브 바가 나타날수 있도록 소스를 추가하였다.
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnProgressDialog:
mProgressDlg = new ProgressDlgSample(MainActivity.this).execute(100);
break;
case R.id.btnProgressLarge:
mProgressLarge.setVisibility(ProgressBar.VISIBLE);
mProgressLarge.setIndeterminate(true);
mProgressLarge.setMax(100);
break;
case R.id.btnProgressMid:
mProgressMid.setVisibility(ProgressBar.VISIBLE);
mProgressMid.setIndeterminate(true);
mProgressMid.setMax(100);
break;
case R.id.btnProgressSmall:
mProgressSmall.setVisibility(ProgressBar.VISIBLE);
mProgressSmall.setIndeterminate(true);
mProgressSmall.setMax(100);
break;
case R.id.btnProgressStick:
mProgressStick.setVisibility(ProgressBar.VISIBLE);
mProgressStick.setIndeterminate(true);
mProgressStick.setMax(100);
break;
default:
break;
}
}
|
2. ProgressDialog 를 이용해 구현하기 |
AsyncTask 상속받아 ProgressDialog 구현할 클래스를 만든다.
상속받으면 다음과 같은 함수를 구현해야한다.
onPreExecute() : doInBackground() 가 실행되기 이전에 호출되는 함수로 여기에서는
ProgressDialog 객체를 생성한다. 그리고 show 함수를 통해 다이얼로그를
화면에 띄운다.
@Override
protected void onPreExecute() {
mDlg = new ProgressDialog(mContext);
mDlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDlg.setMessage("Start");
mDlg.show();
super.onPreExecute();
}
doInBackground() : execute 함수를 실행할 때 수행하는 함수이다. 이 함수가 끝나면
종료하게 되는데 다이얼로그 화면을 갱신하기 위해 publishProgress() 를
이용한다. publishProgress 함수를 호출하게 되면 override 된 함수
onProgressUpdate() 가 호출되게 된다. 여기에 업데이트 과정에서 이루어져야
하는 내용이 들어가면 된다.
마지막으로 함수가 종료하게 되면 override 된 onPostExecute() 가 실행되게
되는데 종료에 관련된 로직이 들어가면 된다.
@Override
protected Integer doInBackground(Integer... params) {
final int taskCnt = params[0];
publishProgress("max", Integer.toString(taskCnt));
for (int i = 0; i < taskCnt; ++i) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 작업이 진행되면서 호출하며 화면의 업그레이드를 담당하게 된다
publishProgress("progress", Integer.toString(i),
"Task " + Integer.toString(i) + " number");
}
// 수행이 끝나고 리턴하는 값은 다음에 수행될 onProgressUpdate 의 파라미터가 된다
return taskCnt;
}
onProgressUpdate() : publishProgress() 함수가 실행되면서 시작되게 되는데 여기에는
다이얼로그 화면에 업데이트 될 내용을 수행하면 된다. 아래 내용은 화면에
표시되는 숫자값을 바꾸는 것으로 되어있다.
@Override
protected void onProgressUpdate(String... progress) {
if (progress[0].equals("progress")) {
mDlg.setProgress(Integer.parseInt(progress[1]));
mDlg.setMessage(progress[2]);
} else if (progress[0].equals("max")) {
mDlg.setMax(Integer.parseInt(progress[1]));
}
}
onPostExecute() : 마지막 종료시 수행되는 함수 이다. doInBackground() 가 종료 되고
넘겨주는 파라미터를 받아 종료시 필요한 처리를 해주면 된다. 아래에는
ProgressDialog 의 종료를 위해 dismiss() 를 호출하였다.
@Override
protected void onPostExecute(Integer result) {
mDlg.dismiss();
Toast.makeText(mContext, Integer.toString(result) + " total sum",
Toast.LENGTH_SHORT).show();
}
|
3. ProgressDlgSample 전체 소스 |
public class ProgressDlgSample extends AsyncTask{ private ProgressDialog mDlg; private Context mContext; public ProgressDlgSample(Context context) { mContext = context; } @Override protected void onPreExecute() { mDlg = new ProgressDialog(mContext); mDlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mDlg.setMessage("Start"); mDlg.show(); super.onPreExecute(); } @Override protected Integer doInBackground(Integer... params) { final int taskCnt = params[0]; publishProgress("max", Integer.toString(taskCnt)); for (int i = 0; i < taskCnt; ++i) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } // 작업이 진행되면서 호출하며 화면의 업그레이드를 담당하게 된다 publishProgress("progress", Integer.toString(i), "Task " + Integer.toString(i) + " number"); } // 수행이 끝나고 리턴하는 값은 다음에 수행될 onProgressUpdate 의 파라미터가 된다 return taskCnt; } @Override protected void onProgressUpdate(String... progress) { if (progress[0].equals("progress")) { mDlg.setProgress(Integer.parseInt(progress[1])); mDlg.setMessage(progress[2]); } else if (progress[0].equals("max")) { mDlg.setMax(Integer.parseInt(progress[1])); } } @Override protected void onPostExecute(Integer result) { mDlg.dismiss(); Toast.makeText(mContext, Integer.toString(result) + " total sum", Toast.LENGTH_SHORT).show(); } }
|
4. 전체 프로젝트 소스와 실행 화면 |
전체 소스 :
SampleProgress.zip
'안드로이드 개발' 카테고리의 다른 글
| 안드로이드(Android) activity 에서 activity 로 Object 넘기기 (1) | 2013.12.08 |
|---|---|
| 안드로이드(Android) 에서 ViewFlipper 을 이용해 화면 애니메이션 구현하기 (0) | 2013.11.24 |
| 안드로이드(Android) SeekBar 위젯을 이용해 화면 밝기 조정하기 (0) | 2013.10.28 |
| 안드로이드(android) WebView 페이지 이동과 웹에서 다운받은 파일 SDCARD 에서 확인 (0) | 2013.10.21 |
| 안드로이드(Android) FrameLayout 이용해서 페이지 슬라이딩 구현하기 (7) | 2013.10.08 |
| 안드로이드(android) FrameLayout 을 이용해서 이미지 뷰 전환하기 (0) | 2013.10.06 |
| 안드로이드(android) 상대레이아웃(RelativeLayout) 속성값 알아보기 (0) | 2013.10.05 |
| 안드로이드(Android) 에서 layout_gravity 와 gravity 속성차이 알아보기 (0) | 2013.10.03 |

