[Android] Custom Dialog Android 2012. 3. 6. 15:09
사용자가 정의하는 다이얼로그를 이야기 한다.

먼저 다른 레이아웃에다가 다이얼로그에 위치 시킬 내용들을 xml 형식으로 구현 한 후 다음과 같이 코드를 입력해보면 다이얼로그도 자유롭게 이용 할 수 있을 것이다.

물론 여기서 다중 선택이나 이러한 내용을 접목하는 것은 개인 역량에 달려있다.

public class ImageViewActivity extends Activity{
 Button btns;
 boolean[] m_flag = {false,false,false,false};
 public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);
  btns = (Button)findViewById(R.id.btn1);
  btns.setOnClickListener(new Button.OnClickListener(){
   public void onClick(View v){
    final LinearLayout linear = (LinearLayout)View.inflate(ImageViewActivity.this, R.layout.subactivity, null);
    AlertDialog.Builder alt = new AlertDialog.Builder(ImageViewActivity.this);
    alt.setTitle("Title");
    alt.setIcon(R.drawable.ic_launcher);
    alt.setView(linear);
    alt.setPositiveButton("확인", new DialogInterface.OnClickListener() {     
     public void onClick(DialogInterface dialog, int which) {      
      EditText first = (EditText)linear.findViewById(R.id.txt_edit1);
      EditText second = (EditText)linear.findViewById(R.id.txt_edit2);
      TextView txt = (TextView)findViewById(R.id.txt_view);
      txt.setText(first.getText()+" "+second.getText());
     }
    });
    alt.setNegativeButton("닫기", null);
    alt.show();  
   }
  });  
 } 
}
[Android] Dialog -2 Android 2012. 3. 6. 14:25

다이얼로그 선택에서 기본은 하나만 선택 할 것인지 다중으로 선택 할 것인지를 나타낸다.

setItems를 할 경우 뒤 쪽에 선택 부분이 나타나지 않고 xml 상에 정의된 배열 데이터가 그대로 나타나지만,

setSingleChoiceItems 를 이용해서 다이얼로그 속성을 싱글 선택일 경우 선택 부분이 라디오 버튼으로 나온다.

다음 코드를 보면 이 두개의 차이를 볼 수가 있다.

public class ImageViewActivity extends Activity{
 Button btns;
 public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);
  btns = (Button)findViewById(R.id.btn1);
  btns.setOnClickListener(new Button.OnClickListener(){
   public void onClick(View v){
    AlertDialog.Builder alt = new AlertDialog.Builder(ImageViewActivity.this);
    alt.setTitle("Title");
    alt.setIcon(R.drawable.ic_launcher);
    //alt.setItems(R.array.array, new DialogInterface.OnClickListener() {
    alt.setSingleChoiceItems(R.array.array, 0, new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
      // TODO Auto-generated method stub
      String[] temp = getResources().getStringArray(R.array.array);
      TextView txt = (TextView)findViewById(R.id.txt_view);
      txt.setText(temp[which]);
     }
    });
    alt.setNegativeButton("닫기", null);
    alt.show();    
   }
  });  
 } 
}
다른 경우로 멀티로 선택 가능 한 경우이다. 위의 코드에서 한 부분을

alt.setMultiChoiceItems(R.array.array, m_flag, new DialogInterface.OnMultiChoiceClickListener() {     
     public void onClick(DialogInterface dialog, int which, boolean isChecked) {
      m_flag[which] = isChecked;
      String[] temp = getResources().getStringArray(R.array.array);
      TextView txt = (TextView)findViewById(R.id.txt_view);
      String result = "";
      for(int i=0;i<m_flag.length;i++){
       if(m_flag[i]){
        result+=temp[i] + " ";
       }
       else{
        result.replace(temp[i]+" ", "");
       }
      }
      txt.setText(result);
     }
    });

대체하면 아이템의 마지막 부분에 체크 박스 형태가 생기면서 여러개를 선택 할 수 있다.

실행을 해 보면 그 차이를 알 수가 있을 것이다.

[Android] Dialog - 1 Android 2012. 3. 6. 13:50
안드로이드 상에서는 토스트보다 다이얼로그를 이용하여 경고 등과 같은 내용들을 표시한다.

왜냐면 토스트는 일정 시간이 지나면 자연적으로 사라지기 때문이다. 물론 finish를 이용하여 다이얼로그도 사라지게는 가능하다.

AlertDialog 같은 경우는 프로세스상 non-blocking 형태로 그 아래 코드까지 모두 사용된다. 여기에서 주의가 필요하다.

그 아래 코드에 finish 를 실행한다면.. 당연히 사라질테니까 말이다.

AlertDialog는 생성자가 protected 처리가 되어 있어서 Builder로 생성해야한다. AlertDialog.Builder(Context context) 를 호출하여 이용하면 된다.  그리고 다이얼로그를 보여주는데는 Show 와 Create 두가지 방법이 있다.

Create를 이용 할 경우 protected Dialog onCreateDialog(int id) 를 이용하여 생성 될 시 어떤 형태를 보여 주는가를 나타 낼 수 있으며, protected void onPrepareDialog(int id, Dialog dialog) 여기에서 그 내용을 적용 시킬 수 있다.

다음은 간단한 예제 코드이다.

public class ImageViewActivity extends Activity{
 Button btns;
 public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);
  btns = (Button)findViewById(R.id.btn1);
  btns.setOnClickListener(new Button.OnClickListener(){
   public void onClick(View v){
    AlertDialog.Builder alt = new AlertDialog.Builder(ImageViewActivity.this);
    alt.setTitle("Title");
    alt.setMessage("대화상자 오픈");
    alt.setIcon(R.drawable.ic_launcher);
    alt.setPositiveButton("OK", new DialogInterface.OnClickListener() {     
     @Override
     public void onClick(DialogInterface dialog, int which) {
      showDialog(0);      
     }
    });
    alt.setNeutralButton("DON'T", new DialogInterface.OnClickListener() {     
     @Override
     public void onClick(DialogInterface dialog, int which) {
      // TODO Auto-generated method stub
      
     }
    });
    alt.setNegativeButton("NO", new DialogInterface.OnClickListener() {     
     @Override
     public void onClick(DialogInterface dialog, int which) {
      // TODO Auto-generated method stub
      
     }
    });
    alt.setCancelable(false);
    alt.show();    
   }
  });  
 }
 
 protected Dialog onCreateDialog(int id){
  switch(id){
   case 0 :
    return new AlertDialog.Builder(ImageViewActivity.this).setTitle("Title").setMessage("Create").setPositiveButton("OK", null).create();   
  }
  return null;
 }
 
 protected void onPrepareDialog(int id, Dialog dialog){
  super.onPrepareDialog(id, dialog);
  switch(id){
   case 0 :
    dialog.setTitle("TestTitle");
   break;
  }
 }
}
코드를 보면 setPositiveButton,setNeutralButton,setNegativeButton 부분이 보일 것이다. 말 그대로 승인, 중립, 거부의 경우를 나타낸다.

또한 이들의 첫번째 인자는 버튼에 나타내는 텍스트를 의미하며 두번째 인자는 해당 이벤트를 연결 한 것이다.

이 이벤트 내용을 따로 정의하여 클릭 할 때 마다 다이얼로그를 생성하여 여러 작업을 수행 할 수가 있다.