안드로이드(Android) 사용자정의 진행 다이얼로그(Custom Progress Dialog) 만드는 방법 |
환경: Eclipse Mars, Android 4.2.2 |
이번에는 Dialog 클래스로 ProgressDialog 와 동일한 형태를 만들어 보겠습니다. ProgressDialog형태로 만들려면 Dialog 레이아웃에 ProgressBar 를 추가한 후 이미지로 애니메이션 효과를 줘야 합니다. 그럼 ProgressDialog 와 동일한 형태가 되는 것이죠.
▼ Dialog 를 ProgressDialog 처럼 만들기 위해 이미지를 회전시키는 애니메이션 효과를 적용했습니다. Dialog 레이아웃 XML 에 ProgressBar 위젯을 추가합니다. 추가한 ProgressBar 에 이미지가 회전할수 있도록 animated rotate 기능을 이용했습니다. android:indeterminateDrawable 속성값으로 애니메이션 효과를 구현하는 dlg_progress.xml 리소스를 추가하시면 됩니다. 아래 소스는 Dialog 클래스를 상속받아서 만들었으며 팝업창 처럼 보이기 위해 requestWindowFeature(Window.FEATURE_NO_TITLE) 소스로 타이틀을 삭제했습니다.
import android.app.Dialog; import android.content.Context; import android.view.Window; public class CustomProgressDialog extends Dialog{ public CustomProgressDialog(Context context) { super(context); requestWindowFeature(Window.FEATURE_NO_TITLE); // setContentView(R.layout.custom_progress_dialog); } }
▼ 아래 XML 은 ProgressDialog 처럼 만들기 위해 Dialog 화면 레이아웃을 꾸몄습니다.제목과 바로 아래 진행바를 배치했습니다.
custom_progress_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="6dp" android:background="@drawable/dlg_bg" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="In progress..." android:textSize="20sp" /> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" android:indeterminateDrawable="@drawable/dlg_progress" /> </RelativeLayout>
▼ 아래 두개의 XML 은 레이아웃 디자인을 위한 것들입니다. dlg_bg.xml 은 다이얼로그화면 색상이나 형태를 지정한 옵션이며, dlg_progress.xml 은 이미지를 회전시켜서 진행바처럼 보이게 하기 위한 애니메이션 설정 XML 입니다.
dlg_bg.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#ccffffff"/> <corners android:radius="6dp"/> <stroke android:color="#6699CC" android:width="1dp"/> </shape>
dlg_progress.xml
<?xml version="1.0" encoding="utf-8"?> <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/rotate" android:pivotX="50%" android:pivotY="50%"> </animated-rotate>
▼ 위에서 만든 Dialog 를 적용하기 위한 소스는 다음과 같습니다. 클래스 객체를 생성하고 onPreExecute() 함수에 다이얼로그 show() 함수를 호출하면 뜨겠죠.그리고 setBackgroundDrawable() 값으로 Color.TRANSPARENT 를 해주지 않으면 그림에서 처럼 모서리가 각이 지게 됩니다.
CustomProgressDialog progressDlg = new CustomProgressDialog( CustomProgressActivity.this); @Override protected void onPreExecute() { progressDlg.getWindow().setBackgroundDrawable( new ColorDrawable( android.graphics.Color.TRANSPARENT)); progressDlg.show(); // 보여주기 super.onPreExecute(); }
▼ 진행이 끝나면 다이얼로그 창을 종료해야 겠죠. AsyncTask 에서 종료에 관련된 기능은 onPostExecute() 콜백함수에서 처리하시면 됩니다. 다이얼로그를 종료하기 위해 dismiss() 함수를 호출합니다.
@Override protected void onPostExecute(Void result) { progressDlg.dismiss(); // 없애기 super.onPostExecute(result); }
▼ 아래는 Dialog 클래스를 ProgressDialog 처럼 구현한 메인 Activity 전체 소스
입니다. 버튼을 클릭하면 다이얼로그가 시작합니다.
import android.app.Activity; import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class CustomProgressActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_progress); 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<Void, Void, Void> { CustomProgressDialog progressDlg = new CustomProgressDialog( CustomProgressActivity.this); @Override protected void onPreExecute() { progressDlg.getWindow().setBackgroundDrawable( new ColorDrawable( android.graphics.Color.TRANSPARENT)); progressDlg.show(); super.onPreExecute(); } @Override protected Void doInBackground(Void... arg0) { try { for (int i = 0; i < 5; i++) { Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { progressDlg.dismiss(); // 없애기 super.onPostExecute(result); } } }
'안드로이드 개발' 카테고리의 다른 글
안드로이드(Android) 스레드(Thread) 이용한 ProgressDialog 구현하기 (0) | 2020.01.26 |
---|---|
안드로이드(Android) 이미지 드래그 앤 드랍(Drag and Drop) 하는 방법 (3) | 2019.12.01 |
안드로이드(Android) ImageView 사이즈(size) 조절하는 방법 (1) | 2019.11.11 |
안드로이드(Android) 가로 세로 모드 자동회전 고정하는 방법 (0) | 2019.10.30 |
안드로이드(Android) 다이얼로그(Dialog) Animation 효과 넣는 방법 (1) | 2019.10.28 |
안드로이드(Android) Theme.dialog 로 Activity 화면을 팝업(dialog) 만드는 방법 (0) | 2019.10.27 |
안드로이드(Android) 다이얼로그(Dialog) 키보드 Back key 눌렀을 때 종료하는 방법 (0) | 2019.10.26 |
안드로이드(Android) 기본 알림창인 AlertDialog 에 ListView 표현하는 방법 (3) | 2019.10.26 |