ProgressBar '프로그래스바'
작업 진행 정도나 진행 중임을 보여주기 위한 View
2가지 종류 - '막대 모양 / 원 모양'
1) 막대 모양
- 진행 정도를 표시하기 위한 'ProgressBar 클래스'
- style="?android:attr/progressBarStyleHorizontal" : 막대 스타일 설정
- indeterminateOnly="false" : 최대범위 지정없이, 현재 진행형임을 표시할건지
- max : 최대 범위
- progress : 초기 값
- Java Method
void setProgress(int progess) : progress 값으로 진행 정도 설정
void incrementProgressBy(int difference) : 현재 값 기준으로 더하거나 빼기 설정
<ProgressBar
android:id="@+id/progress"
android:layout_width="match_parent"
android:layout_height="50dp"
style="?android:attr/progressBarStyleHorizontal" // 막대 스타일 설정
android:indeterminateOnly="false" // 현재 진행형 여부(값x, 원형), false
android:max="100" // 최대 범위설정, 100
android:progress="25" // 초기 값(progress) 설정, 25
/>
2) 원 모양
- 진행 중임을 표시하기 위한 'ProgressDialog 클래스'
- ProgressDialog
new ProgressDialog(context, android.R.style.Theme_Material_Dialog_Alert)
: 생성자 함수, 안드로이드 제공 레이아웃 변경
void setProgressStyle(ProgressDialog.STYLE_SPINNER : Style 원 모양 설정
void setMessage(String msg) : 표시할 Message
void setCanceledOnTouchOutside(false) : 화면 터치 시 Dialog 꺼짐 막기 설정
void show() : Dialog UI 표시
void dismiss() : Dialog UI 제거
AsyncTask에서 실행
onPreExecute() -> doInBackground() -> onPostExecute()
↘ onProgressUpdate() : 백그라운드 작업 중 UI조작 위해, publishProgress()
class Progress_Task extends AsyncTask<Integer, Integer, Void> {
private ProgressDialog progressDialog = null; // 원형 ProgressBar 생성
public Progress_Task() { super(); }
@Override
// doInBackground 전에 실행(UI Thread) - 백그라운드 작업 전 초기화 부분
protected void onPreExecute() {
super.onPreExecute();
// ProgressDialog 생성, 레이아웃 변경
progressDialog = new ProgressDialog(ProgressActivity.this, android.R.style.Theme_Material_Dialog_Alert);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // Style - 원 모양 설정
progressDialog.setMessage("Loadingg..."); // Message - 표시할 텍스트
progressDialog.setCanceledOnTouchOutside(false); // 터치시 Canceled 막기
progressDialog.show(); // UI 표시
}
@Override
// 백그라운드 작업 시작, UI 조작 불가, onPreExcute() 종료후 바로 호출
protected Void doInBackground(Integer... ints) {
for (int i = 0; i < 4; i++) {
try {
// UI Update, publishProgress() - onProgressUpdate 호출
publishProgress(ints[0]);
Thread.sleep(500); // 0.5초 간격 UI Update
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
// UI 조작가능 (UI Thread에서 실행)
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.incrementProgressBy(values[0]);
progress_value.setText(progressBar.getProgress()+"%");
}
@Override
// UI Thread에서 실행, doInBackground 종료 후 바로 호출
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
progressDialog.dismiss(); // ProgressDialog 지우기
progressBar.setProgress(20);
progress_value.setText(progressBar.getProgress()+"%");
}
}
Thread 실행
Background 작업 중 중간중간 UI 조작위해, runOnUiThread() 내부 선언
progress_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Thread 생성 - Background 작업위해
new Thread(new Runnable() {
@Override
public void run() {
// ProgressBar Update - 4번 반복
for (int i = 0; i < 4; i++) {
// runOnUiThread() - Background 작업 중 UI 조작위해
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.incrementProgressBy(20);
progress_value.setText(String.valueOf(progressBar.getProgress()));
}
});
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.setProgress(20);
progress_value.setText(String.valueOf(progressBar.getProgress()));
}
});
}
}).start(); // Thread Background 작업 실행
}
});