Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[37일차 Android] Dialog 본문

Computer/Android

[37일차 Android] Dialog

Wise-99 2023. 6. 23. 23:21

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Dialog

  • 메시지 전달이나 입력 등의 용도로 사용한다.
  • Dialog가 나타나 있을 때는 주변의 View를 사용할 수 없다.

 

 

기본 다이얼로그

  • 기본 다이얼로그는 메시지와 최대 3개의 버튼을 제공할 수 있다.
button.setOnClickListener {
	// 다이얼로그 생성을 위한 객체를 생성한다.
	val builder = AlertDialog.Builder(this@MainActivity)

	// 타이틀
	builder.setTitle("기본 다이얼로그")
	// 메세지
	builder.setMessage("기본 다이얼로그 입니다")
	// 아이콘
	builder.setIcon(R.mipmap.ic_launcher)

	// 버튼을 배치한다.
	// builder.setPositiveButton("Positive", null)
	// builder.setNegativeButton("Negative", null)
	// builder.setNeutralButton("Neutral", null)

	builder.setPositiveButton("Positive"){ dialogInterface: DialogInterface, i: Int ->
		textView.text = "Positive 버튼을 눌렀습니다"
	}
	builder.setNegativeButton("Negative"){ dialogInterface: DialogInterface, i: Int ->
		textView.text = "Negative 버튼을 눌렀습니다"
	}
	builder.setNeutralButton("Neutral"){ dialogInterface: DialogInterface, i: Int ->
		textView.text = "Neutral 버튼을 눌렀습니다"
	}

	// 다이얼로그를 띄운다.
	builder.show()
}
  • // builder.setPositiveButton("Positive", null) : 버튼을 배치했지만 추가적인 기능이 없다.
  • builder.setPositiveButton("Positive"){ ... } : 해당 버튼을 누르면 textView의 text를 변경하도록 한다.

 

 

 

결과


 

커스텀 Dialog

  • 기본 다이얼로그에 View를 설정하면 다이얼로그에 표시되는 모양을 자유롭게 구성할 수 있다.

dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/editTextDialog1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text" />

    <EditText
        android:id="@+id/editTextDialog2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text" />
</LinearLayout>

 

 

 

button2.setOnClickListener {
	val dialogBinding = DialogBinding.inflate(layoutInflater)
	val builder = AlertDialog.Builder(this@MainActivity)
	builder.setTitle("커스텀 다이얼로그")
	builder.setIcon(R.mipmap.ic_launcher)

	builder.setView(dialogBinding.root)

	dialogBinding.editTextDialog1.requestFocus()

	thread {
		SystemClock.sleep(500)
		val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
		imm.showSoftInput(dialogBinding.editTextDialog1,0)
	}

	builder.setPositiveButton("확인") { dialogInterface: DialogInterface, i: Int ->
		// 입력한 내용을 가져온다.
		val str1 = dialogBinding.editTextDialog1.text.toString()
		val str2 = dialogBinding.editTextDialog2.text.toString()

		textView.text = "${str1}\n"
		textView.append("${str2}")
	}

	builder.setNegativeButton("취소", null)
}
  • builder.setView(dialogBinding.root) : 커스텀한 dialog.xml 파일로 새로운 뷰를 설정한다.
  • 확인을 누르면 입력한 내용을 textView에 보이도록 한다.
  • 취소를 누르면 입력한 내용이 textView에 보여지지 않는다.

 

 

 

결과


 

DatePicker

  • 다이얼로그를 통해 날짜를 선택할 수 있도록 제공되는 Dialog
button3.setOnClickListener {

	val calendar = Calendar.getInstance()
	val year = calendar.get(Calendar.YEAR)
	var month = calendar.get(Calendar.MONTH)
	val day = calendar.get(Calendar.DAY_OF_MONTH)

	val datePickerListener = object : DatePickerDialog.OnDateSetListener{
		override fun onDateSet(
			view: DatePicker?,
			year: Int,
			month: Int,
			dayOfMonth: Int
		) {
			textView.text = "${year}년 ${month + 1}월 ${dayOfMonth}일"
		}
	}

	val pickerDialog = DatePickerDialog(this@MainActivity, datePickerListener, year, month, day)
	pickerDialog.show()
}
  • val calendar = Calendar.getInstance() : 현재의 날짜를 불러온다.
  • val datePickerListener = object : DatePickerDialog.OnDateSetListener{ ... }
    • 날짜를 선택하면 동작할 리스너
    • 날짜를 선택하면 textView에 해당 날짜를 보여준다.
  • val pickerDialog = DatePickerDialog() : context, listener, 현재 날짜를 넣어 보여준다.

 

 

 

결과


 

TimePicker

  • 시간을 선택할 수 있도록 제공되는 Dialog
button4.setOnClickListener {
	val calendar = Calendar.getInstance()

	val hour = calendar.get(Calendar.HOUR)
	val minute = calendar.get(Calendar.MINUTE)


	val timePickerListener = object : TimePickerDialog.OnTimeSetListener{
		// 두 번째 : 시간, 세 번째 : 분
		override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {
			textView.text = "${p1}시 ${p2}분"
		}
	}

	val pickerDialog = TimePickerDialog(this@MainActivity, timePickerListener, hour, minute, true)
	pickerDialog.show()
}

 

 

 

결과


 

단일 선택 ListDialog

  • 리스트를 사용하여 선택지를 줄 수 있는 Dialog
val dataList = arrayOf(
	"항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
	"항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
	"항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
)

button5.setOnClickListener {
	val adapter = ArrayAdapter<String>(this@MainActivity, android.R.layout.simple_list_item_1, dataList)

	val builder = AlertDialog.Builder(this@MainActivity)
	builder.setTitle("리스트 다이얼로그")
	builder.setIcon(R.mipmap.ic_launcher)

	builder.setAdapter(adapter){ dialogInterface: DialogInterface, i: Int ->
		textView.text = "선택한 항목 : ${dataList[i]}"
	}

	builder.setNegativeButton("취소", null)
	builder.show()
}
  • builder.setAdapter(adapter){ ... }
    • 어뎁터를 설정한다.
    • 두번째 매개 변수( i )에는 사용자가 선택한 항목의 순서 값이 들어온다.

 

 

 

결과


 

다중 선택 ListDialog1

  • List에서 한 개 이상의 선택을 할 수 있도록 하는 Dialog
val dataList = arrayOf(
	"항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
	"항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
	"항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
)

button6.setOnClickListener {
	val builder = AlertDialog.Builder(this@MainActivity)
	builder.setTitle("다중 선택 리스트 다이얼로그")

	val boolArray = BooleanArray(dataList.size) { i -> false }

	boolArray[0] = true
	boolArray[2] = true
	boolArray[4] = true

	builder.setMultiChoiceItems(dataList, boolArray, null)

	builder.setNegativeButton("취소", null)
	builder.setPositiveButton("확인"){ dialogInterface: DialogInterface, i: Int ->
		textView.text = ""

		// 다이얼로그에서 ListView를 추출한다.
		val alertDialog = dialogInterface as AlertDialog
		// 현재 체크되어 있는 상태 정보를 추출한다.
		val position = alertDialog.listView.checkedItemPositions
		// 위에서 반환된 객체에는 채크 되어있는 것과 체크 상태가 변경된 것들의 정보만 담겨져 있다.
		// {순서 값 = 체크 여부}
		for (idx in 0 until position.size()){
			// 현재 항목의 위치 값을 가져온다.
			val pos1 = position.keyAt(idx)
			// 현재 번째 배열에 값을 넣어준다.
			boolArray[pos1] = position.get(pos1)
		}

		for(idx in 0 until boolArray.size) {
			if (boolArray[idx] == true) {
				textView.append("${dataList[idx]}\n")
			}
		}
	}

	builder.show()
}
  • val boolArray = BooleanArray(dataList.size) { i -> false } : dataList의 size 만큼 false로 채워진 배열을 만든다.
  • builder.setMultiChoiceItems(dataList, boolArray, null) : dataList와 boolArray를 가지고 다중 선택을 할 수 있도록 한다.
  • alertDialog.listView에는 체크된 항목과 체크 상태가 변경된 것들의 정보가 담겨져 있다.
  • 따라서 체크 상태가 변경되어 false가 되더라도 listView에 담기게 된다.
  • 하단의 for문을 통해 true인 항목만 걸러 textView에 나타낸다.

 

 

 

결과


 

다중 선택 ListDialog2

val dataList = arrayOf(
	"항목1", "항목2", "항목3", "항목4", "항목5", "항목6",
	"항목7", "항목8", "항목9", "항목10", "항목11", "항목12",
	"항목13", "항목14", "항목15", "항목16", "항목17", "항목18"
)

val mutilChoiceList = BooleanArray(dataList.size){i -> false}

button7.setOnClickListener {
	val builder = AlertDialog.Builder(this@MainActivity)
	builder.setTitle("다중 선택 리스트 다이얼로그")

	// 마지막 매개변수에 체크 상태가 변경되었을 때 동작하는 리스너를 설정해준다.
	// 여기에서 체크 상태가 변경된 항목의 체크 상태 값을 BooleabArray에 담아준다.
	// 두번째 : 체크 상태가 변경된 항목의 순서 값
	// 세번째 : 체크 상태
	builder.setMultiChoiceItems(dataList, mutilChoiceList){ dialogInterface: DialogInterface, i: Int, b: Boolean ->
		mutilChoiceList[i] = b
	}

	builder.setNegativeButton("취소", null)
	builder.setPositiveButton("확인"){ dialogInterface: DialogInterface, i: Int ->
		textView.text = ""

		for (idx in 0 until mutilChoiceList.size){
			if(mutilChoiceList[idx] == true) {
				textView.append("${dateList[idx]}\n")
			}
		}
	}

	builder.show()
}
  • val mutilChoiceList = BooleanArray(dataList.size){i -> false} : dataList의 size 만큼 mutilChoiceList를 false로 채운다.
  • 해당 코드는 체크 상태가 변경될 때마다 리스트의 값이 새로 저장된다.
  • 확인을 눌러야만 체크 상태가 true인 항목이 textView에 나타나게 된다.

 

 

 

결과

'Computer > Android' 카테고리의 다른 글

[38일차 Android] Pending Intent  (0) 2023.06.25
[38일차 Android] Notification  (0) 2023.06.25
[37일차 Android] SnackBar  (0) 2023.06.23
[37일차 Android] Toast  (0) 2023.06.23
[37일차 Android] 다른 앱의 Activity 실행하기  (0) 2023.06.23