안드로이드(Android) ProgressDialog Cancel Button 추가하는 방법 |
환경 : Eclipse Mars, Android 4.2.2 |
보통 ProgressDialog 에는 취소 버튼을 두지 않습니다. 끝날때 까지 기다리게 되죠. 그런데 시간이 많이 걸리는 작업은 사용자가 중지할수 있어야 겠죠. 그래서 이번에는 ProgressDialog 에 취소와 숨기기 버튼을 만들어서 버튼 클릭시 다이얼로그가 사라지도록 구현해 보겠습니다.
▼ ProgressDialog 클래스는 Dialog 를 상속받아서 만들었기 때문에 DialogInterface 옵션값으로 버튼을 추가할수 있습니다. setButton() 함수의 옵션으로 BUTTON_NEGATIVE 와 BUTTON_POSITIVE 값과 OnClickListener 인터페이스 클래스를 넘기면 버튼이 생성됩니다. 버튼 클릭시 기능은 onClick() 함수 내부에 구현하시면 되겠죠. 둘다 클릭하게 되면 기본적으로 창을 사라지게 합니다.
dlg.setButton(DialogInterface.BUTTON_NEGATIVE, "취소",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(getBaseContext(),
"Cancle clicked",
Toast.LENGTH_SHORT).show();
}
});
dlg.setButton(DialogInterface.BUTTON_POSITIVE, "숨기기",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(getBaseContext(),
"Hide clicked",
Toast.LENGTH_SHORT).show();
}
});
▼ 취소나 숨기기 버튼을 누르게 되면 AsyncTask 의 doInBackground() 함수에서 진행중인 로직이 중지되는 것은 아닙니다. 백그라운더에서 계속 돌아가고 로직이 끝나게 되면 doPostExecute() 함수가 실행되게 되는 것이죠. 다이얼로그만 보이지 않는 것이며 실제로 돌고 있습니다.
@Override
protected String doInBackground(String... arg0) {
try {
for (int i = 0; i < 50; i++) {
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]);
dlg.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String result) {
dlg.dismiss();
super.onPostExecute(result);
}
▼ 아래 소스는 ProgressDialog 창에 두개의 버튼을 구현한 전체 메인 Activity 소스 입니다. 화면 레이아웃 XML 은 버튼 하나만 있어서 소스를 올리지 않았습니다.
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
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;
import android.widget.Toast;
public class ProgressDialogButtonActivity 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 dlg = new ProgressDialog(
ProgressDialogButtonActivity.this);
@Override
protected void onPreExecute() {
dlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dlg.setMessage("로딩중입니다..");
dlg.setButton(DialogInterface.BUTTON_NEGATIVE, "취소",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(getBaseContext(),
"Cancle clicked",
Toast.LENGTH_SHORT).show();
}
});
dlg.setButton(DialogInterface.BUTTON_POSITIVE, "숨기기",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(getBaseContext(),
"Hide clicked",
Toast.LENGTH_SHORT).show();
}
});
dlg.show();// show dialog
super.onPreExecute();
}
@Override
protected String doInBackground(String... arg0) {
try {
for (int i = 0; i < 50; i++) {
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]);
dlg.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String result) {
dlg.dismiss();
super.onPostExecute(result);
}
}
}
'안드로이드 개발' 카테고리의 다른 글
[Android] 안드로이드 인터넷 이미지 다운로드 해서 ImageView 표현하기 (2) | 2020.07.12 |
---|---|
안드로이드(Android) 라이브러리 프로젝트 참조 만들기 (0) | 2020.06.23 |
안드로이드 Android 앱 배포를 위한 개발자 등록하기 (0) | 2020.05.01 |
안드로이드 개발 중복 리소스가 나타나서 에러가 발생하는 경우 Multiple implementations resource (0) | 2020.04.08 |
안드로이드(Android) ProgressDialog 숫자 상태정보 퍼센트(Percentage) 로 표현하는 방법 (0) | 2020.02.16 |
안드로이드(Android) 스레드(Thread) 이용한 ProgressDialog 구현하기 (0) | 2020.01.26 |
안드로이드(Android) 이미지 드래그 앤 드랍(Drag and Drop) 하는 방법 (3) | 2019.12.01 |
안드로이드(Android) ImageView 사이즈(size) 조절하는 방법 (1) | 2019.11.11 |