안드로이드(Android) ProgressDialog(프로그레스 다이얼로그) 구현 방법 |
환경: Eclipse Mars, Android 4.2.2 |
앱에서 시간이 걸리는 작업을 수행할 때 ProgressDialog 클래스를 이용하면 사용자에게 실시간 진행 상태를 알릴 수 있습니다. 그리고 진행이 다 끝나면 팝업창은 사라지게 됩니다. 이런 ProgressDialog 에는 두 가지 종류가 있습니다. "스핀" 과 진행정도를 나타내는 "바" 형태의 다이얼로그입니다.
▼ 먼저 스핀 ProgressDialog 다이얼로그를 살펴 보겠습니다. 스핀은 진행과정을 표시하지는 않고 계속해서 돌아가는 그림만 보여주죠. ProgressDialog 의 setProgressStyle() 함수에 ProgressDialog.STYLE_SPINNER 옵션을 넘기시고 setMessage() 에 표현하고 싶은 메시지를 입력합니다. 마지막으로 다이얼로그를 띄우기 위해 show() 함수를 호출합니다.
ProgressDialog asyncDialog = new ProgressDialog(
ProgressDialogActivity.this);
@Override
protected void onPreExecute() {
asyncDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
asyncDialog.setMessage("로딩중입니다..");
// show dialog
asyncDialog.show();
super.onPreExecute();
}
▼ 진행 다이얼로그(ProgressDialog) 를 독립적으로 사용되면 의미가 없죠. 시간이 걸리는 작업을 하기 때문에 Thread 나 AsyncTask 클래스에 포함되어서 사용됩니다. AsyncTask 는 Thread 를 사용할 일이 있을 때 좀더 편리하게 이용할수 있도록 안드로이드에서 지원하고 있는 클래스 입니다. AsyncTask 를 상속받아 만든 클래스는 3가지 함수를 구현해야 합니다. 이 3가지 함수들에 ProgressDialog 기능을 구현하시면 됩니다.
◎ onPreExecute() : 작업시작, ProgressDialog 객체를 생성하고 시작합니다.
◎ doInBackground() : 진행중, ProgressDialog 의 진행 정도를 표현해 줍니다.
◎ doPostExecute() : 종료, ProgressDialog 종료 기능을 구현합니다.
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
public class ProgressDialogActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_dialog);
CheckTypesTask task = new CheckTypesTask();
task.execute();
}
private class CheckTypesTask extends AsyncTask<Void, Void, Void> {
ProgressDialog asyncDialog = new ProgressDialog(
ProgressDialogActivity.this);
@Override
protected void onPreExecute() {
asyncDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
asyncDialog.setMessage("로딩중입니다..");
// show dialog
asyncDialog.show();
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... arg0) {
try {
for (int i = 0; i < 5; i++) {
//asyncDialog.setProgress(i * 30);
Thread.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
asyncDialog.dismiss();
super.onPostExecute(result);
}
}
}
▼ 두번째 ProgressDlg 의 형태인 진행바 입니다. ProgressDialog.STYLE_SPINNER 대신ProgressDialog.STYLE_HORIZONTAL 입력하시면 됩니다. 그리고 나머지 셋팅은
동일하죠.
ProgressDialog asyncDialog = new ProgressDialog(
ProgressDialogActivity.this);
@Override
protected void onPreExecute() {
asyncDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
asyncDialog.setMessage("로딩중입니다..");
// show dialog
asyncDialog.show();
super.onPreExecute();
}
▼ ProgressDlg 의 진행바 형태이기 때문에 진행정도를 나타낼수 있도록 셋팅을 해주어야 합니다. AsyncTask 에서 doInBackground() 함수가 작업 진행을 알리는 CALLBACK 함수이죠. 이곳에 ProgressDlg 의 setProgress() 함수를 셋팅해 주시면 됩니다.
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
public class ProgressDialogActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_dialog);
CheckTypesTask task = new CheckTypesTask();
task.execute();
}
private class CheckTypesTask extends AsyncTask<Void, Void, Void> {
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 Void doInBackground(Void... arg0) {
try {
for (int i = 0; i < 5; i++) {
asyncDialog.setProgress(i * 30);
Thread.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
asyncDialog.dismiss();
super.onPostExecute(result);
}
}
}
▼ 아래 그림처럼 doInBackground() 에 setProgress() 값을 셋팅해주시면 작업이 종료 될 때까지 바 그래프와 숫자값이 바뀌겠죠. 이상으로 ProgressDlg 의 두가지 형태를 AsyncTask 와 함께 어떤식으로 사용하는지 알아 보았습니다.
댓글을 달아 주세요
초보자 2015.04.29 17:49 댓글주소 수정/삭제 댓글쓰기
안녕 하세요 인터넷을 한참 찾아 헤메다 방문 하게 되었습니다.
지금 제가 서버 통신 부분을 AsyncTask 로 구현은 해 놨는데 ProgressDialog 가 없어 위에 해 두신
스핀 ProgressDialog를 사용 해보려고 하는데요....잘 않되서요.... 혹시 염치 불구 하고...위에 구현 해 놓으신 소스좀 받을수 있을까 해서 이렇게 글 남겨 봅니다.....
android.app.ProgressDialog; 는 안드로이드 API 기본 클래스 입니다.
Ctrl + Shift + O 를 하시면 자동으로 추가 될겁니다. 다시 한번 해보시기
바랍니다. ^^
창효 2016.01.20 12:44 댓글주소 수정/삭제 댓글쓰기
녹두장군님 블로그에서 늘 양질의 자료를 얻어갑니다.
좋은 정보 감사합니다~
요즘 안드로이드 관련 포스팅을 많이 올리지 못해 죄송하네요 ^^
space 2016.09.02 09:08 댓글주소 수정/삭제 댓글쓰기
포스팅 잘 봤습니다. 그런데 왼쪽하단에 60% 표시가 있는데 오른쪽에 60/100은 왜나오는건가요? 숫자표시하는부분이 어느부분인지를 잘 모르겠습니다.
전체 값 대비 현재 값을 표시하는 부분인데 % 단위는 당연히 100% 겠지만 % 가 일반 숫자로 표시한다면 최대값이 얼마인지 표시할 필요가 있겠죠. 이 부분을 수정하는 함수는 더 찾아봐야겠네요.
송경호 2018.07.28 12:01 댓글주소 수정/삭제 댓글쓰기
백프레스 버튼에 다이얼로그를 뛰워서 애드몹 광고를 구현하고싶은데 어떻게 구현하는지 알고싶습니다 ㅠ
포스팅 감사합니다. 혹시 해당 프로그레스에 따라 로딩창 텍스트 내용을 변경하려면 어떻게 해야되는지 알 수 있을까요..? 찾아도 잘 안나오네요 ㅠㅠ..