Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android) ProgressDialog 숫자 상태정보 퍼센트(Percentage) 로 표현하는 방법

 

환경 : Eclipse Mars, Android 4.2.2

 

ProgressDialog 의 진행막대에 표시되는 숫자값을 퍼센트와 동일하게 바꾸는 방법에 대해 알아 보겠습니다. % 는 전체 진행정도를 알려주고 오른쪽에 숫자는 전체값에서 얼마나 진행되었는지 실제 값을 나타내죠. 이 두개를 동일하게 표현하고 싶을 때가 있습니다.

 

▼ 아래 그림처럼 왼쪽 % 값과 오른쪽에 숫자값을 동일하게 맞출려고 합니다. 

 

▼ 먼저 진행바를 셋팅하기 위해 AsyncTask 의 시작 함수인 onPreExecute() ProgressDialog 객체 속성값을 셋팅하고 띄웁니다.

ProgressDialog asyncDialog = new ProgressDialog(
		ProgressDialogActivity.this);

@Override
protected void onPreExecute() {
	asyncDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
	asyncDialog.setMessage("로딩중입니다..");
	
	// show dialog
	asyncDialog.show();
	super.onPreExecute();
}

 

▼ 보통 AsyncTask 의 진행중일 때 호출되는 콜백함수인 doInBackground() 에 진행바의 숫자값을 셋팅합니다. setProgress() 함수의 인수로 값을 넘기면 표시가되는데 이번에는 publishProgress() 함수를 사용하겠습니다.

@Override
protected String doInBackground(String... arg0) {
	try {
		for (int i = 0; i < 5; i++) {
			//asyncDialog.setProgress(i * 30);
			publishProgress(""+(int)(i * 30));
			Thread.sleep(500);
		}
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	return null;
}

 

publishProgress () 실행하면 내부적으로 onProgressUpdate() 함수가 호출됩니다.이 콜백함수 내부를 구현하시면 됩니다. 넘어온 값을 setProgress() 의 인수로 셋팅하면 % 값과 오른쪽에 있는 실제 수치가 일치하게 되죠.

protected void onProgressUpdate(String... progress) {
     Log.d("ANDRO_ASYNC",progress[0]);
     asyncDialog.setProgress(Integer.parseInt(progress[0]));
}

 

▼ 이렇게 완성된 메인 Activity 의 전체 소스 입니다.

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ProgressDialogActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_progress_dialog);

		Button button = (Button) findViewById(R.id.btn_alert);

		// 클릭 이벤트
		button.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				CheckTypesTask task = new CheckTypesTask();
				task.execute();
			}
		});
	}

	private class CheckTypesTask extends AsyncTask<String, String, String> {
		
		ProgressDialog asyncDialog = new ProgressDialog(
				ProgressDialogActivity.this);

		@Override
		protected void onPreExecute() {
			asyncDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			asyncDialog.setMessage("로딩중입니다..");
			
			// show dialog
			asyncDialog.show();
			super.onPreExecute();
		}

		@Override
		protected String doInBackground(String... arg0) {
			try {
				for (int i = 0; i < 5; i++) {
					//asyncDialog.setProgress(i * 30);
					publishProgress(""+(int)(i * 30));
					Thread.sleep(500);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return null;
		}
		
		protected void onProgressUpdate(String... progress) {
	         Log.d("ANDRO_ASYNC",progress[0]);
	         asyncDialog.setProgress(Integer.parseInt(progress[0]));
	    }
		
		@Override
		protected void onPostExecute(String result) {
			asyncDialog.dismiss();
			super.onPostExecute(result);
		}
	}
}


Posted by 녹두장군

댓글을 달아 주세요