본문 바로가기

Android/Dialog

안드로이드/Android Inflater 적용한 Alertdialog 만들기

안드로이드/Android Inflater 적용한 Alertdialog 만들기

▒ ▒  ▒  ▒  ▒  ▒  ▒  전체 소스 입니다. ▒ ▒  ▒  ▒  ▒  ▒  ▒
package arabiannight.tistory.com;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;

public class TestAlertdialogActivity extends Activity {
	
	private static final int ALL_CHECK_BUTTON = 0;
	
	private CheckBox[] mCheckBoxs;
	private Dialog mMainDialog;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	public void onClickView(View v){
		switch (v.getId()) {
		case R.id.main_button:
			mMainDialog = createDialog();
			mMainDialog.show();
			break;
		}
	}
	
	private AlertDialog createDialog() {
		final View innerView = getLayoutInflater().inflate(R.layout.dialog_layout, null);
		AlertDialog.Builder ab = new AlertDialog.Builder(this);
		ab.setTitle("Title");
		ab.setView(innerView);
		
		mCheckBoxs = new CheckBox[] { 
				(CheckBox)innerView.findViewById(R.id.cb_check_all),
				(CheckBox)innerView.findViewById(R.id.cb_01),
				(CheckBox)innerView.findViewById(R.id.cb_02),
				(CheckBox)innerView.findViewById(R.id.cb_03),
				(CheckBox)innerView.findViewById(R.id.cb_04),
				(CheckBox)innerView.findViewById(R.id.cb_05),
				(CheckBox)innerView.findViewById(R.id.cb_06) 
		};
		
		ab.setPositiveButton("확인", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface arg0, int arg1) {
				setDismiss(mMainDialog);
			}
		});
		
		ab.setNegativeButton("취소", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface arg0, int arg1) {
				setDismiss(mMainDialog);
			}
		});
		
		mCheckBoxs[ALL_CHECK_BUTTON].setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				allChecked(mCheckBoxs , mCheckBoxs[ALL_CHECK_BUTTON].isChecked());
			}
		});
		
		return  ab.create();
	}
	
	private void setDismiss(Dialog dialog){
		if(dialog!=null&&dialog.isShowing())
			dialog.dismiss();
	}
	
	private void allChecked(CheckBox[] checkboxs, boolean isChecked){
		for(CheckBox chBoxs : mCheckBoxs){
			chBoxs.setChecked(isChecked);
		}
	}
}

▒ ▒  ▒  ▒  ▒  ▒  ▒  Detail 설명 입니다.  ▒ ▒  ▒  ▒  ▒  ▒  ▒ 


▒ 1.
다이얼로그를 생성, 호출 하는 부분 입니다.
mMainDialog = createDialog();
mMainDialog.show();
public void onClickView(View v){
        switch (v.getId()) {
        case R.id.main_button:
            mMainDialog = createDialog();
            mMainDialog.show();
            break;
        }
    }


▒ 2. 
새로운 레이아웃으로 inflate(재전개) 시킨후 새로 생성한 AlertDialog에 setView 메서드를 통해 삽입시켜 줍니다.
setTitle은 다이얼로그의 제목을 지정 합니다.
setPositiveButton , setNegativeButton 버튼은 각각 다이얼로그 성공과 취소시 이벤트를 지정해 줄 수 있습니다.

현재는 확인 , 취소 버튼을 눌렀을 경우 모두 다이얼로그가 종료되게 코딩 되어 있습니다.
private AlertDialog createDialog() {
        final View innerView = getLayoutInflater().inflate(R.layout.dialog_layout, null);
        AlertDialog.Builder ab = new AlertDialog.Builder(this);
        ab.setTitle("Title");
        ab.setView(innerView);
                
        ab.setPositiveButton("확인", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                setDismiss(mMainDialog);
            }
        });
         
        ab.setNegativeButton("취소", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                setDismiss(mMainDialog);
            }
        });
                
        return  ab.create();
    }
     


▒ 3.  
아래 보시면 CheckBox를 배열로 선언해서 참조변수를 만들었습니다. 일일이 전부 변수를 만들어서 선언 하는 것 보다는 훨씬 간단하고 간편해 보입니다. 나중에 CheckBox의 체크 여부를 확인 하는 것도 훨씬 쉽겠죠?ㅎㅎ
( CheckBox[확인하고싶은 체크박스의 번호] ).isChecked; 로 확인 하시면 됩니다.
 private CheckBox[] mCheckBoxs;

mCheckBoxs = new CheckBox[] { 
                (CheckBox)innerView.findViewById(R.id.cb_check_all),
                (CheckBox)innerView.findViewById(R.id.cb_01),
                (CheckBox)innerView.findViewById(R.id.cb_02),
                (CheckBox)innerView.findViewById(R.id.cb_03),
                (CheckBox)innerView.findViewById(R.id.cb_04),
                (CheckBox)innerView.findViewById(R.id.cb_05),
                (CheckBox)innerView.findViewById(R.id.cb_06) 
        };



▒ 4.  
이 부분은 현재 다이얼로그가 null이 아니고(활성화된 상태이고) ,
또한 보여지고 있는 상태라면 다이얼로그를 dismiss(종료) 시켜 줍니다.
private void setDismiss(Dialog dialog){
        if(dialog!=null&&dialog.isShowing())
            dialog.dismiss();
    }



▒ 5.  
현재 Checkbox를 모두 저장하고 있는 배열과 , 첫번째 CheckBox 배열(전체선택 채크박스)의 현재 체크 상태를 반환해 줍니다.
 private void allChecked(CheckBox[] checkboxs, boolean isChecked){
        for(CheckBox chBoxs : mCheckBoxs){ //checkboxs 인데 코딩이 잘못 됬네요.엌 --;;
                                           //현재는 mCheckBoxs로 받고 있습니다.
            chBoxs.setChecked(isChecked);
        }
    }
현재 전체선택 체크박스가 true일때는 모든 체크박스에 true
현재 전체선택 체크박스가 false일때는 모든 체크박스에 false가 들어가겠죠?

위에서 사용되는 for문은 향상된 for문으로 Checkbox로 매개변수로 넘겨받은 checkboxs의 배열의 길이만큼 작업을 해줍니다.

예를들어 checkboxs로 넘겨받은 매개변수의 길이가 9라고 하면,

[0체크박스].setChecked(isChecked);
[1체크박스].setChecked(isChecked);
[2체크박스].setChecked(isChecked);
.
.
.
[8체크박스].setChecked(isChecked);


이런식으로  9번 수행이 되겠네요.



▒ 맺음말. 
전체 소스가 필요하신분은 받아가시기 바랍니다!! (바로 아래 있습니다 ㅎ)

그럼 오늘도 좋은 하루되시기 바랍니다~!! 뿅*!~!


아참 중요한걸 빼 먹었네요 !! Alertdialog를 생성해서 버튼을 만들면 (확인,취소) 기본적으로 클릭 후에 다이얼로그는 종료 됩니다. 그래서 이벤트를 따로 처리 하지 않아도 다이얼로그는 사라지는게 정상이니 그점 유의 하시기 바랍니다~!!

그리고 이런 문제점을 해결 하기 위해서는 Dialog를 상속받는 Custom Dialog를 만들어야 합니다~!!