Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android) ProgressDialog Cancel Button 추가하는 방법

안드로이드 개발
반응형

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

 

 

반응형
Posted by 녹두장군

댓글을 달아 주세요