Android

ProgressDialog 만들기 예제

Ms_Tony 2016. 3. 31. 14:04


이번엔 어떤 일의 진행상황을 유저에게 눈으로 보여줄 수 있는 

ProgressDialog를 만들어보려고 합니다.

ProgressDialog는 유저가 요청한 작업이 바로 실행되지 않고

작업하는데 시간이 걸릴 때 보여주면 답답함도 덜고,

눈으로 직접 확인 할 수 있어 더욱 효율적이라 생각합니다.


만들어볼 것은 가로바 형태의 ProgressDialog와 원형 형태를 만들어볼 예정이고,

구글에서 제공하는 기본 Progress를 사용할 예정입니다.


우선 activity_main.xml 입니다.


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/btnProgressDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Dialog1" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/btnProgressLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Large" />

<Button
android:id="@+id/btnProgressMid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Middle" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/btnProgressSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Small" />

<Button
android:id="@+id/btnProgressStick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Stick" />

</LinearLayout>

<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<ProgressBar
android:id="@+id/progressBar2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<ProgressBar
android:id="@+id/progressBar3"
style="?android:attr/progressBarStyleSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<ProgressBar
android:id="@+id/progressBar4"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" /></LinearLayout>


각각의 버튼을 눌렀을 경우 그에 맞는 Progress를 보여주게 하기 위해 

Button과 Progress를 따로 세팅해 두었습니다.


그 다음 ProgressDlg.java입니다.

Progress의 경우 메인쓰레드가 아닌 Background에서 돌아야하므로

AsyncTask를 상속받아 Class를 새로 하나 작성했습니다.

/**
* 프로그래스바는 UI쓰레드가 아닌 서브에서 따로 돌아야 하므로
* AsyncTask를 써서 Background에서 돌게함
* Created by TonyChoi on 2016. 3. 31..
*/
public class ProgressDlg extends AsyncTask<Integer, String, Integer> {

private ProgressDialog mDlg;
private Context mCtx;

//생성자
public ProgressDlg(Context ctx) {
mCtx = ctx;
}

@Override
protected void onPreExecute() {
//ProgressDialog 세팅
mDlg = new ProgressDialog(mCtx);
//스타일 설정
mDlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//프로그래스 다이얼로그 나올 때 메시지 설정.
mDlg.setMessage("시 작");
//세팅된 다이얼로그를 보여줌.
mDlg.show();

super.onPreExecute();
}

@Override
protected Integer doInBackground(Integer... params) {
//프로그래스바 최대치가 몇인지 설정하는 변수
final int taskCnt = params[0];
//프로그래스바 최대치 설정
publishProgress("max", Integer.toString(taskCnt));

for (int i = 0; i < taskCnt; i ++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//프로그래스바 현재 진행상황 설정
publishProgress("progress", Integer.toString(i),
"Task " + Integer.toString(i) + " number");
}
//PostExecute로 리턴
return taskCnt;
}

//프로그래스가 업데이트 될때 호출
@Override
protected void onProgressUpdate(String... values) {
if (values[0].equals("progress")) {
mDlg.setProgress(Integer.parseInt(values[1]));
mDlg.setMessage(values[2]);
} else if (values[0].equals("max")){
mDlg.setMax(Integer.parseInt(values[1]));
}
}

//Background에서 처리가 완료되면 호출
@Override
protected void onPostExecute(Integer integer) {
//다이얼로그를 없앰
mDlg.dismiss();
Toast.makeText(mCtx, Integer.toString(integer) + " total sum",
Toast.LENGTH_SHORT).show();
}

}


마지막으로 MainActivity.java입니다.

자세한 설명에 대해선 주석으로 설명을 대체하겠습니다.

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private Button mBtnProgressDlg;
private Button mBtnSpinner;
private Button mBtnLarge;
private Button mBtnMid;
private Button mBtnSmall;
private Button mBtnStick;

private AsyncTask<Integer, String, Integer> mProgressDlg;
private ProgressBar mProgressLarge;
private ProgressBar mProgressMid;
private ProgressBar mProgressSmall;
private ProgressBar mProgressStick;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mBtnProgressDlg = (Button) findViewById(R.id.btnProgressDialog);
mBtnLarge = (Button)findViewById(R.id.btnProgressLarge);
mBtnMid = (Button)findViewById(R.id.btnProgressMid);
mBtnSmall = (Button)findViewById(R.id.btnProgressSmall);
mBtnStick = (Button)findViewById(R.id.btnProgressStick);

mProgressLarge = (ProgressBar) findViewById(R.id.progressBar1);
mProgressMid = (ProgressBar) findViewById(R.id.progressBar2);
mProgressSmall = (ProgressBar) findViewById(R.id.progressBar3);
mProgressStick = (ProgressBar) findViewById(R.id.progressBar4);


mBtnProgressDlg.setOnClickListener(this);
mBtnLarge.setOnClickListener(this);
mBtnMid.setOnClickListener(this);
mBtnSmall.setOnClickListener(this);
mBtnStick.setOnClickListener(this);


mProgressLarge.setVisibility(ProgressBar.GONE);
mProgressMid.setVisibility(ProgressBar.GONE);
mProgressSmall.setVisibility(ProgressBar.GONE);
mProgressStick.setVisibility(ProgressBar.GONE);

}

public void onClick(View v) {
switch (v.getId()) {
case R.id.btnProgressDialog:
mProgressDlg = new ProgressDlg(MainActivity.this).execute(100);
break;

case R.id.btnProgressLarge:
mProgressLarge.setVisibility(ProgressBar.VISIBLE);
//게이지가 올라가거나 화살표가 돌아가는 것이 작업이 완료될 때 까지 멈추지 않게(boolean)
mProgressLarge.setIndeterminate(true);
//최대치 설정
mProgressLarge.setMax(100);

break;

case R.id.btnProgressMid:
mProgressMid.setVisibility(ProgressBar.VISIBLE);
mProgressMid.setIndeterminate(true);
mProgressMid.setMax(100);
break;

case R.id.btnProgressSmall:
mProgressSmall.setVisibility(ProgressBar.VISIBLE);
mProgressSmall.setIndeterminate(true);
mProgressSmall.setMax(100);
break;

case R.id.btnProgressStick:
mProgressStick.setVisibility(ProgressBar.VISIBLE);
mProgressStick.setIndeterminate(true);
mProgressStick.setMax(100);
break;

default:
break;
}
}

}


마지막으로 실행 시 나오는 출력화면과 프로젝트 압축파일입니다.



SampleProgress.zip


'Android' 카테고리의 다른 글

Android VideoView 예제  (5) 2016.04.05
Android EditText 아이폰 X버튼 만들기  (0) 2016.04.04
TouchEvent 사용법  (0) 2016.03.31
Android 데이터베이스 사용법  (2) 2016.03.29
ScrollView 안에 ListView 또는 GridView 사용 시  (0) 2015.11.03