코드네임 :
📱 모바일프로그래밍 - (중간-AlertDialog3 x 그냥 여따 코드) 모르는거 정리 5 📱 본문
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. 역할과 설명
- String[] versionArray: 이 코드는 문자열 배열을 정의합니다. 배열의 이름은 versionArray이며, 이 배열에는 사용자가 선택할 수 있는 항목들이 들어 있습니다.
- "쫄면", "떡볶이", "김밥"은 각각 배열의 요소이며, 사용자가 다이얼로그에서 선택할 수 있는 옵션입니다.
- dlg.setItems(versionArray, new DialogInterface.OnClickListener() {...});:
- setItems() 메서드는 다이얼로그에 리스트 형식의 선택 항목을 표시하도록 설정합니다. 여기서 versionArray가 리스트의 항목 데이터로 사용됩니다.
- 두 번째 인자로 **OnClickListener**가 전달되는데, 사용자가 리스트에서 특정 항목을 클릭했을 때 실행될 코드를 정의합니다
- 항목 선택 시 동작:
- dlg.setItems(versionArray, new DialogInterface.OnClickListener() {...}) 부분에서, 사용자가 리스트의 항목 중 하나를 클릭하면 클릭된 항목의 인덱스(i)가 전달됩니다.
- 클릭된 항목의 인덱스를 이용해 versionArray[i]로 사용자가 선택한 문자열 값을 가져옵니다.
- 그 값이 button2.setText(versionArray[i]);를 통해 버튼의 텍스트로 설정됩니다. 즉, 사용자가 "떡볶이"를 선택하면 버튼의 텍스트가 "떡볶이"로 변경됩니다.
new DialogInterface.OnClickListener() {...}:
이 부분은 익명 클래스를 통해 **OnClickListener**를 구현합니다.
사용자가 다이얼로그의 리스트에서 항목을 선택했을 때 자동으로 호출됩니다.
이 메서드 안에서, 사용자가 클릭한 항목의 인덱스를 통해 원하는 동작을 수행할 수 있습니다.
코드 동작 흐름
- versionArray 배열에 사용자가 선택할 수 있는 항목 "쫄면", "떡볶이", "김밥"을 정의합니다.
- button2 버튼이 클릭되면 **OnClickListener**가 작동하여, AlertDialog 대화상자를 띄웁니다.
- setItems(versionArray, ...)를 통해 사용자가 리스트에서 항목을 선택할 수 있게 하고, 사용자가 항목을 선택하면 그 항목의 이름이 버튼의 텍스트로 설정됩니다.
- 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();
}
});
코드 설명
- boolean[] checkArray = new boolean[] {false, false, false};
- **checkArray**는 다이얼로그에서 각 항목이 선택되었는지 여부를 저장하는 배열입니다.
- 배열의 각 요소는 false로 초기화되어 있으며, 이는 모든 항목이 초기에는 선택되지 않음을 의미합니다.
- 배열의 길이는 versionArray(간식 이름이 담긴 배열)의 길이와 동일해야 합니다.
- button4.setOnClickListener(new View.OnClickListener() {...}
- 버튼 button4가 클릭되었을 때 실행될 동작을 정의하는 코드입니다.
- 익명 클래스를 통해 OnClickListener를 구현하고, 클릭 시 멀티 선택 대화상자를 표시하는 동작을 설정합니다.
- AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
- 대화상자를 생성하기 위해 AlertDialog.Builder 객체를 만듭니다. MainActivity.this는 대화상자가 현재 액티비티 위에 표시되도록 하기 위해 컨텍스트를 전달하는 부분입니다.
- dlg.setTitle("좋아하는 간식은?");
- 대화상자의 제목을 설정합니다. 사용자가 선택할 항목이 무엇인지 설명하는 역할을 합니다.
- dlg.setIcon(R.mipmap.ic_launcher);
- 대화상자의 왼쪽에 표시될 아이콘을 설정합니다. 앱의 기본 아이콘을 사용하고 있습니다.
- dlg.setMultiChoiceItems(versionArray, checkArray, new DialogInterface.OnMultiChoiceClickListener() {...});
- 멀티 선택 항목을 설정하는 부분입니다. 각 항목은 체크박스로 표시되며, 사용자가 여러 개를 선택할 수 있습니다.
- versionArray: 항목 목록을 제공하는 문자열 배열입니다. "쫄면", "떡볶이", "김밥" 같은 간식 이름들이 들어 있습니다.
- checkArray: 각 항목의 초기 선택 상태를 나타내는 불린 배열입니다. 초기에는 모두 false로 설정되어 모든 항목이 선택되지 않은 상태입니다.
- new DialogInterface.OnMultiChoiceClickListener(): 사용자가 체크박스를 클릭할 때 호출되는 리스너입니다.
- onClick(DialogInterface dialogInterface, int i, boolean b)
- 이 메서드는 사용자가 체크박스를 클릭할 때마다 호출됩니다.
- i: 사용자가 클릭한 항목의 인덱스입니다. 예를 들어, 첫 번째 항목이 클릭되면 i는 0이 됩니다.
- b: 현재 항목의 선택 상태를 나타내는 불린 값입니다. 사용자가 항목을 선택하면 true, 선택을 해제하면 false가 됩니다.
- Toast.makeText(MainActivity.this, versionArray[i]+"선택됨", Toast.LENGTH_SHORT).show();: 사용자가 항목을 클릭할 때마다 토스트 메시지를 표시합니다. 선택된 항목의 이름과 함께 "선택됨"이라는 메시지를 보여줍니다.
- dlg.setPositiveButton("닫기", null);
- 대화상자에 "닫기" 버튼을 추가합니다. 이 버튼을 누르면 대화상자가 닫힙니다.
- 버튼 클릭에 대한 특별한 동작은 정의하지 않기 때문에 null로 설정합니다.
- 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"과 같이 표시됩니다.
- onDateSet(): 사용자가 날짜를 선택하고 확인 버튼을 눌렀을 때 호출됩니다.
- 세 번째, 네 번째, 다섯 번째 인자: 기본으로 설정할 날짜를 지정합니다. 여기서는 현재 날짜를 설정합니다.
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"와 같이 표시됩니다.
- onTimeSet(): 사용자가 시간을 선택하고 확인 버튼을 눌렀을 때 호출됩니다.
- 세 번째, 네 번째 인자: 기본 시간과 분을 설정합니다. 여기서는 현재 시간(hour)과 분(minute)을 사용합니다.
- 다섯 번째 인자: false는 24시간 형식을 사용하지 않고 **12시간 형식(AM/PM)**을 사용하겠다는 의미입니다. 만약 24시간 형식을 사용하고 싶다면 true로 설정하면 됩니다.
4. 다이얼로그 표시
timeDialog.show();
- timeDialog.show()를 호출하여 시간 선택 대화상자를 화면에 표시합니다. 사용자가 이 대화상자에서 시간을 선택할 수 있게 됩니다.
'백엔드 > Android_JAVA' 카테고리의 다른 글
📱 모바일프로그래밍 - (중간- 코드 ) 모르는거 정리 7 📱 (0) | 2024.10.24 |
---|---|
📱 모바일프로그래밍 - (중간) 모르는거 정리 6 📱 (0) | 2024.10.24 |
📱 모바일프로그래밍 - (중간) 모르는거 정리 4 📱 (0) | 2024.10.24 |
📱 모바일프로그래밍 - (중간) 모르는거 정리 3 (Midterm2.android)📱 (0) | 2024.10.24 |
📱 모바일프로그래밍 - (중간 - Midterm.Android) 모르는거 정리2 📱 (0) | 2024.10.23 |