코드네임 :

📱 모바일프로그래밍 - (중간-AlertDialog3 x 그냥 여따 코드) 모르는거 정리 5 📱 본문

백엔드/Android_JAVA

📱 모바일프로그래밍 - (중간-AlertDialog3 x 그냥 여따 코드) 모르는거 정리 5 📱

비엔 Vien 2024. 10. 24. 01:23

First Code

        button1.setOnClickListener(new View.OnClickListener() { //버튼1이 눌렷을 때 (리스너 구현 클래스)
            @Override
            public void onClick(View view) { //온클릭 메소드 재정리
                //대화상자 띄우는 코드
                AlertDialog.Builder dlg=new AlertDialog.Builder(MainActivity.this); // 다이얼로그 대화상자를 하나 띄워 봅시다
                dlg.setTitle("제목입니다");
                dlg.setMessage("내용입니다");
                dlg.setIcon(R.mipmap.ic_launcher); //이거 안드로이드 동그란 초록 아이콘 추가
                dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() {
                            //확인버튼 (오른쪽 하단으로 위치)
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(MainActivity.this, "확인", Toast.LENGTH_SHORT).show();
                            } //오 이거 코드가 null이면 아무 행동도 안취하니까 Toast로 확인 메세지 띄우게 해준 코드구나
                });
                dlg.setNegativeButton("ㅎㅇ", null); //확인버튼 (오른쪽 하단으로 위치)
                dlg.setNeutralButton("gd", null); //확인버튼 (왼쪽 하단으로 위치)

                dlg.show(); // 쇼를 해야만 dlg가 불러와짐
            }

 

1. Toast.makeText(MainActivity.this, "확인", Toast.LENGTH_SHORT).show();에서 MainActivity.this를 쓰는 경우와 this만 쓰는 경우의 차이가 뭐야?

 
 

Toast.makeText(MainActivity.this, "확인", Toast.LENGTH_SHORT).show();에서 **MainActivity.this**와 **this**를 사용하는 경우의 차이는 **컨텍스트(Context)**의 참조 대상이 어디인지에 따라 달라집니다. 안드로이드에서 Toast나 다른 UI 관련 요소를 사용할 때 적절한 컨텍스트를 전달하는 것이 중요합니다. 이 두 가지는 다음과 같은 차이가 있습니다.

1. MainActivity.this

  • 정확한 컨텍스트를 명시적으로 지정하는 방법입니다.
  • MainActivity는 현재 액티비티의 클래스 이름이고, this는 해당 클래스의 인스턴스를 가리킵니다.
  • 따라서 MainActivity.this는 MainActivity 클래스의 컨텍스트를 정확히 참조합니다.
  • 이 방법은 익명 클래스나 내부 클래스 안에서 컨텍스트를 참조할 때 많이 사용됩니다. 익명 클래스나 내부 클래스 내부에서 this를 사용하면 해당 클래스 자신을 참조하게 되기 때문에, 이 경우에는 명시적으로 MainActivity.this를 사용하여 액티비티의 컨텍스트를 지정해야 합니다.

예시 (익명 클래스 안에서 MainActivity.this 사용)

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "확인", Toast.LENGTH_SHORT).show(); // MainActivity의 컨텍스트 사용
    }
});
  • 이 코드에서는 버튼 클릭 이벤트 리스너가 익명 클래스로 구현되어 있습니다. 이 경우 this는 OnClickListener를 참조하기 때문에, 액티비티의 컨텍스트를 참조하려면 **MainActivity.this**를 사용해야 합니다.

2. this

  • 현재 클래스의 인스턴스를 참조합니다.
  • 액티비티 내부에서 this는 현재 액티비티의 컨텍스트를 가리킵니다. 따라서 Toast.makeText(this, "확인", Toast.LENGTH_SHORT).show();처럼 사용할 수 있습니다.
  • 단, 이 경우는 액티비티 본체에서 직접 Toast를 호출할 때만 가능합니다. 예를 들어, 액티비티의 onCreate 메서드나 다른 액티비티 메서드 안에서는 this를 사용할 수 있습니다.

예시 (this 사용)

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

    Toast.makeText(this, "확인", Toast.LENGTH_SHORT).show(); // 현재 액티비티의 컨텍스트 사용
}
  • 이 코드는 액티비티의 onCreate 메서드 안에서 작성된 코드이므로, this가 현재 액티비티를 가리킵니다. 따라서 this를 사용해도 문제없이 Toast를 표시할 수 있습니다.

요약

  • MainActivity.this: 명시적으로 현재 액티비티의 컨텍스트를 지정할 때 사용합니다. 특히 익명 클래스나 내부 클래스 안에서 액티비티의 컨텍스트를 참조해야 할 때 사용합니다.
  • this: 현재 클래스의 인스턴스를 가리키며, 액티비티 본체에서 직접 사용할 때는 현재 액티비티의 컨텍스트로 사용됩니다.

따라서, 익명 클래스 안에서 Toast나 다른 UI 요소를 사용할 때는 **MainActivity.this**를 사용해야 하고, 액티비티 메서드 내에서 직접 사용하는 경우에는 **this**를 사용할 수 있습니다.

 


 

Second Code - 목록 대화상자 -> setItems()

        String[] versionArray = new String[] {"쫄면", "떡볶이", "김밥"};
        button2.setOnClickListener(new View.OnClickListener() { //버튼1이 눌렷을 때 (리스너 구현 클래스)
            @Override
            public void onClick(View view) { //온클릭 메소드 재정리
                //대화상자 띄우는 코드
                AlertDialog.Builder dlg=new AlertDialog.Builder(MainActivity.this); // 다이얼로그 대화상자를 하나 띄워 봅시다
                dlg.setTitle("좋아하는 간식은?");
                dlg.setItems(versionArray, new DialogInterface.OnClickListener() { //OnClickListener()가 익명클래스
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) { //익명 클래스 안에서 onClick() 메서드를 정의
                                                                                  //익명 클래스를 사용하면, 이 메서드를 정의할 때
                                                                                  //별도의 클래스를 만들 필요 없이 코드 안에서 바로 동작을 구현할 수 있습니다.
                        button2.setText(versionArray[i]);
                    }
                });
                dlg.setPositiveButton("닫기", null);
                dlg.show();
            }
        });

1. 버튼 클릭 이벤트 설정

button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 대화상자를 띄우는 코드가 여기에 포함됩니다.
    }
});
  • button3.setOnClickListener(): 버튼 button1이 클릭되었을 때 실행될 동작을 설정합니다.
  • 익명 클래스를 사용하여 OnClickListener를 구현하고, onClick() 메서드 안에 버튼이 클릭되었을 때 실행할 코드를 작성합니다.

 

 

1. 처음에 String[] ~은 왜 하는거야?

 

A. 처음에 String[] versionArray = new String[] {"쫄면", "떡볶이", "김밥"};는 다이얼로그에서 선택할 항목들을 배열로 정의하는 부분입니다. 이 배열은 다이얼로그에 리스트 형태로 표시되며, 사용자가 선택할 수 있는 옵션을 제공합니다.

 

 

 

 

2. 역할과 설명

  1. String[] versionArray: 이 코드는 문자열 배열을 정의합니다. 배열의 이름은 versionArray이며, 이 배열에는 사용자가 선택할 수 있는 항목들이 들어 있습니다.
    • "쫄면", "떡볶이", "김밥"은 각각 배열의 요소이며, 사용자가 다이얼로그에서 선택할 수 있는 옵션입니다.
  2. dlg.setItems(versionArray, new DialogInterface.OnClickListener() {...});:
    • setItems() 메서드는 다이얼로그에 리스트 형식의 선택 항목을 표시하도록 설정합니다. 여기서 versionArray가 리스트의 항목 데이터로 사용됩니다.
    • 두 번째 인자로 **OnClickListener**가 전달되는데, 사용자가 리스트에서 특정 항목을 클릭했을 때 실행될 코드를 정의합니다
  3. 항목 선택 시 동작:
    • dlg.setItems(versionArray, new DialogInterface.OnClickListener() {...}) 부분에서, 사용자가 리스트의 항목 중 하나를 클릭하면 클릭된 항목의 인덱스(i)가 전달됩니다.
    • 클릭된 항목의 인덱스를 이용해 versionArray[i]로 사용자가 선택한 문자열 값을 가져옵니다.
    • 그 값이 button2.setText(versionArray[i]);를 통해 버튼의 텍스트로 설정됩니다. 즉, 사용자가 "떡볶이"를 선택하면 버튼의 텍스트가 "떡볶이"로 변경됩니다.
new DialogInterface.OnClickListener() {...}:

이 부분은 익명 클래스를 통해 **OnClickListener**를 구현합니다.
사용자가 다이얼로그의 리스트에서 항목을 선택했을 때 자동으로 호출됩니다.
이 메서드 안에서, 사용자가 클릭한 항목의 인덱스를 통해 원하는 동작을 수행할 수 있습니다.

코드 동작 흐름

  1. versionArray 배열에 사용자가 선택할 수 있는 항목 "쫄면", "떡볶이", "김밥"을 정의합니다.
  2. button2 버튼이 클릭되면 **OnClickListener**가 작동하여, AlertDialog 대화상자를 띄웁니다.
  3. setItems(versionArray, ...)를 통해 사용자가 리스트에서 항목을 선택할 수 있게 하고, 사용자가 항목을 선택하면 그 항목의 이름이 버튼의 텍스트로 설정됩니다.
  4. dlg.setPositiveButton("닫기", null);는 닫기 버튼을 추가하여, 사용자가 다이얼로그를 닫을 수 있도록 합니다.

Third Code - 라디오 버튼 -> setItems() 대신 setSingleChoiceItems() 하면 라디오 버튼 형태로 출력

        String[] versionArray = new String[] {"쫄면", "떡볶이", "김밥"};
        //라디오 버튼은 딱 한개만 선택 가능한 -> setSingleChoiceItems(~)
        button3.setOnClickListener(new View.OnClickListener() { //버튼1이 눌렷을 때 (리스너 구현 클래스)
            @Override
            public void onClick(View view) { //온클릭 메소드 재정리
                //대화상자 띄우는 코드
                AlertDialog.Builder dlg=new AlertDialog.Builder(MainActivity.this); // 다이얼로그 대화상자를 하나 띄워 봅시다
                dlg.setTitle("좋아하는 간식은?");
                dlg.setIcon(R.mipmap.ic_launcher_round);

                dlg.setSingleChoiceItems(versionArray, 0, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        button3.setText(versionArray[i]);
                    }
                });
                dlg.setPositiveButton("닫기", null);
                dlg.show();
            }
        });

1. 버튼 클릭 이벤트 설정

button3.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 대화상자를 띄우는 코드가 여기에 포함됩니다.
    }
});
  • button3.setOnClickListener(): 버튼 button3이 클릭되었을 때 실행될 동작을 설정합니다.
  • 익명 클래스를 사용하여 OnClickListener를 구현하고, onClick() 메서드 안에 버튼이 클릭되었을 때 실행할 코드를 작성합니다.
  •  

2. AlertDialog.Builder 객체 생성

AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("좋아하는 간식은?");
dlg.setIcon(R.mipmap.ic_launcher_round);
  • **AlertDialog.Builder**를 생성하여 대화상자를 설정할 준비를 합니다. MainActivity.this는 액티비티의 컨텍스트를 전달하여 대화상자가 현재 액티비티 위에 표시되도록 합니다.
  • setTitle(): 대화상자의 제목을 "좋아하는 간식은?"으로 설정합니다.
  • setIcon(): 대화상자의 아이콘을 앱의 기본 아이콘(R.mipmap.ic_launcher_round)으로 설정합니다.
  •  

3. setSingleChoiceItems 메서드를 사용하여 라디오 버튼 설정

dlg.setSingleChoiceItems(versionArray, 0, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        button3.setText(versionArray[i]);
    }
});
  • setSingleChoiceItems(): 이 메서드는 라디오 버튼 형식의 항목을 대화상자에 추가합니다. 한 번에 하나의 항목만 선택할 수 있으며, 선택이 변경되면 이전 선택은 자동으로 해제됩니다.
    • 첫 번째 인자 (versionArray): 선택지로 사용될 문자열 배열입니다. "쫄면", "떡볶이", "김밥"과 같은 간식 이름들이 포함되어 있습니다.
    • 두 번째 인자 (0): 기본으로 선택될 항목의 인덱스입니다. 0이면 첫 번째 항목이 기본 선택됩니다.
    • 세 번째 인자 (new DialogInterface.OnClickListener()): 사용자가 항목을 선택할 때 호출될 리스너입니다. 이 리스너의 onClick() 메서드 안에 사용자가 항목을 선택했을 때의 동작을 정의합니다.
  • onClick() 메서드:
    • 이 메서드는 사용자가 항목을 선택할 때마다 호출됩니다.
    • **i**는 사용자가 선택한 항목의 인덱스를 나타냅니다.
    • button3.setText(versionArray[i]);: 사용자가 선택한 항목의 텍스트(versionArray[i])를 button3의 텍스트로 설정합니다. 예를 들어, "떡볶이"를 선택하면 button3의 텍스트가 "떡볶이"로 변경됩니다.
    •  

Fourth Code - 체크박스 목록 대화상자 -> 여러개를 동시에 선택하기위해 setMultiChoiceItems(~) 사용

boolean[] checkArray = new boolean[] {false, false, false}; // 다이얼로그에서 초기에 각 항목이 선택되어잇지 않도록 false

        button4.setOnClickListener(new View.OnClickListener() { //버튼1이 눌렷을 때 (리스너 구현 클래스)
            @Override
            public void onClick(View view) { //온클릭 메소드 재정리
                //대화상자 띄우는 코드
                AlertDialog.Builder dlg=new AlertDialog.Builder(MainActivity.this); // 다이얼로그 대화상자를 하나 띄워 봅시다
                dlg.setTitle("좋아하는 간식은?");
                dlg.setIcon(R.mipmap.ic_launcher);
                dlg.setMultiChoiceItems(versionArray, checkArray, new DialogInterface.OnMultiChoiceClickListener() {
                    @Overridex
                    public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                        Toast.makeText(MainActivity.this, versionArray[i]+"선택됨", Toast.LENGTH_SHORT).show();
                    }
                });
                dlg.setPositiveButton("닫기", null);
                dlg.show();
            }
        });

코드 설명

  1. boolean[] checkArray = new boolean[] {false, false, false};
    • **checkArray**는 다이얼로그에서 각 항목이 선택되었는지 여부를 저장하는 배열입니다.
    • 배열의 각 요소는 false로 초기화되어 있으며, 이는 모든 항목이 초기에는 선택되지 않음을 의미합니다.
    • 배열의 길이는 versionArray(간식 이름이 담긴 배열)의 길이와 동일해야 합니다.
  2. button4.setOnClickListener(new View.OnClickListener() {...}
    • 버튼 button4가 클릭되었을 때 실행될 동작을 정의하는 코드입니다.
    • 익명 클래스를 통해 OnClickListener를 구현하고, 클릭 시 멀티 선택 대화상자를 표시하는 동작을 설정합니다.
  3. AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
    • 대화상자를 생성하기 위해 AlertDialog.Builder 객체를 만듭니다. MainActivity.this는 대화상자가 현재 액티비티 위에 표시되도록 하기 위해 컨텍스트를 전달하는 부분입니다.
  4. dlg.setTitle("좋아하는 간식은?");
    • 대화상자의 제목을 설정합니다. 사용자가 선택할 항목이 무엇인지 설명하는 역할을 합니다.
  5. dlg.setIcon(R.mipmap.ic_launcher);
    • 대화상자의 왼쪽에 표시될 아이콘을 설정합니다. 앱의 기본 아이콘을 사용하고 있습니다.
  6. dlg.setMultiChoiceItems(versionArray, checkArray, new DialogInterface.OnMultiChoiceClickListener() {...});
    • 멀티 선택 항목을 설정하는 부분입니다. 각 항목은 체크박스로 표시되며, 사용자가 여러 개를 선택할 수 있습니다.
    • versionArray: 항목 목록을 제공하는 문자열 배열입니다. "쫄면", "떡볶이", "김밥" 같은 간식 이름들이 들어 있습니다.
    • checkArray: 각 항목의 초기 선택 상태를 나타내는 불린 배열입니다. 초기에는 모두 false로 설정되어 모든 항목이 선택되지 않은 상태입니다.
    • new DialogInterface.OnMultiChoiceClickListener(): 사용자가 체크박스를 클릭할 때 호출되는 리스너입니다.
  7. onClick(DialogInterface dialogInterface, int i, boolean b)
    • 이 메서드는 사용자가 체크박스를 클릭할 때마다 호출됩니다.
    • i: 사용자가 클릭한 항목의 인덱스입니다. 예를 들어, 첫 번째 항목이 클릭되면 i는 0이 됩니다.
    • b: 현재 항목의 선택 상태를 나타내는 불린 값입니다. 사용자가 항목을 선택하면 true, 선택을 해제하면 false가 됩니다.
    • Toast.makeText(MainActivity.this, versionArray[i]+"선택됨", Toast.LENGTH_SHORT).show();: 사용자가 항목을 클릭할 때마다 토스트 메시지를 표시합니다. 선택된 항목의 이름과 함께 "선택됨"이라는 메시지를 보여줍니다.
  8. dlg.setPositiveButton("닫기", null);
    • 대화상자에 "닫기" 버튼을 추가합니다. 이 버튼을 누르면 대화상자가 닫힙니다.
    • 버튼 클릭에 대한 특별한 동작은 정의하지 않기 때문에 null로 설정합니다.
  9. dlg.show();
    • 설정이 완료된 대화상자를 화면에 표시합니다.
    •  

 

여기부터 dlg 사용안함!

Fifth Code - 날짜선택 DatePickerDialog()

button5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view){
                Calendar c = Calendar.getInstance();
                int year = c.get(Calendar.YEAR);
                int month = c.get(Calendar.MONTH);
                int day = c.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog dateDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                        button5.setText(i+" "+i1+" "+i2);
                    }
                }, year, month, day);
                dateDialog.show();
            }
        });

2. 현재 날짜 가져오기

Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
  • Calendar.getInstance(): 현재 날짜와 시간을 나타내는 Calendar 객체를 생성합니다.
  • c.get(Calendar.YEAR): 현재 연도를 가져옵니다.
  • c.get(Calendar.MONTH): 현재 월을 가져옵니다. (Calendar.MONTH는 0부터 시작하므로, 예를 들어 1월은 0, 2월은 1로 표시됩니다.)
  • c.get(Calendar.DAY_OF_MONTH): 현재 일을 가져옵니다.

3. DatePickerDialog 생성

DatePickerDialog dateDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
        button5.setText(i + " " + i1 + " " + i2);
    }
}, year, month, day);
  • DatePickerDialog: 날짜를 선택할 수 있는 대화상자를 생성합니다.
    • 첫 번째 인자: MainActivity.this는 다이얼로그가 표시될 컨텍스트(현재 액티비티)입니다.
    • 두 번째 인자: **OnDateSetListener**는 사용자가 날짜를 선택했을 때 호출되는 리스너입니다.
      • onDateSet(): 사용자가 날짜를 선택하고 확인 버튼을 눌렀을 때 호출됩니다.
        • i: 사용자가 선택한 연도입니다.
        • i1: 사용자가 선택한 입니다. (0부터 시작하므로, 표시할 때는 +1을 해줘야 실제 월과 일치합니다.)
        • i2: 사용자가 선택한 입니다.
      • 이 메서드에서 button5.setText(i + " " + i1 + " " + i2)는 선택한 날짜를 버튼의 텍스트로 설정합니다. 예를 들어, 2024년 10월 23일을 선택하면 "2024 9 23"과 같이 표시됩니다.
    • 세 번째, 네 번째, 다섯 번째 인자: 기본으로 설정할 날짜를 지정합니다. 여기서는 현재 날짜를 설정합니다.

4. 다이얼로그 표시

dateDialog.show();
  • dateDialog.show()를 호출하여 날짜 선택 다이얼로그를 화면에 표시합니다. 사용자가 이 다이얼로그에서 날짜를 선택할 수 있게 됩니다.
  •  

Sixth Code - TimePickerDialog()

button6.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        TimePickerDialog timeDialog = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker timePicker, int i, int i1) {
                button6.setText(i + " " + i1);
            }
        }, hour, minute, false);
        timeDialog.show();
    }
});

2. 현재 시간 가져오기

 
  • Calendar.getInstance(): 현재 시간 정보를 가져오기 위해 Calendar 객체를 생성합니다.
  • c.get(Calendar.HOUR_OF_DAY): 현재 시간을 24시간 형식으로 가져옵니다. (예: 오후 3시는 15로 반환)
  • c.get(Calendar.MINUTE): 현재 분(minute)을 가져옵니다.
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);

3. TimePickerDialog 생성

TimePickerDialog timeDialog = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker timePicker, int i, int i1) {
        button6.setText(i + " " + i1);
    }
}, hour, minute, false);
  • TimePickerDialog: 시간을 선택할 수 있는 대화상자를 생성합니다.
    • 첫 번째 인자: MainActivity.this는 다이얼로그가 표시될 컨텍스트입니다.
    • 두 번째 인자: **OnTimeSetListener**는 사용자가 시간을 선택했을 때 호출되는 리스너입니다.
      • onTimeSet(): 사용자가 시간을 선택하고 확인 버튼을 눌렀을 때 호출됩니다.
        • i: 사용자가 선택한 시간입니다.
        • i1: 사용자가 선택한 입니다.
      • 이 메서드에서 button6.setText(i + " " + i1)는 선택한 시간을 버튼의 텍스트로 설정합니다. 예를 들어, 오후 3시 45분을 선택하면 "15 45"와 같이 표시됩니다.
    • 세 번째, 네 번째 인자: 기본 시간을 설정합니다. 여기서는 현재 시간(hour)과 분(minute)을 사용합니다.
    • 다섯 번째 인자: false는 24시간 형식을 사용하지 않고 **12시간 형식(AM/PM)**을 사용하겠다는 의미입니다. 만약 24시간 형식을 사용하고 싶다면 true로 설정하면 됩니다.

4. 다이얼로그 표시

timeDialog.show();
  • timeDialog.show()를 호출하여 시간 선택 대화상자를 화면에 표시합니다. 사용자가 이 대화상자에서 시간을 선택할 수 있게 됩니다.