안드로이드(Android) ProgressBar 진행바 구현하기

안드로이드 개발

안드로이드(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

 

 

Posted by 녹두장군